# Schnittstellen und Exceptions



## JavaIsTheBest (5. Jul 2016)

Hallo,
warum wird in der Methode put() nur die BufferFullException geworfen und nicht die NullPointerException.


----------



## JCODA (5. Jul 2016)

http://javatricks.de/tricks/unterschied-checked-vs-unchecked-exception



> *Was ist eine Checked Exception?*
> Checked Exceptions sind alle Exceptions die von der Klasse Exception erben, außer jenen, die von RuntimeException erben. Wie oben bereits erwähnt müssen Checked Exceptions entweder durch eine Angabe in der Methodensignatur mit dem throws-Keyword, oder durch Abfangen in einem try-catch Block behandelt werden. Java überprüft zur Compilezeit, ob die Exception entsprechend behandelt wird.





> *Was ist eine Unchecked Exception?*
> Unchecked Exceptions sind solche, die "ohne Ankündigung" geworfen werden können, also nicht in einer Methodensignatur angegeben werden. Bekannte Beispiele von Unchecked Exceptions sind ArrayIndexOutOfBoundsException, IllegalArgumentException oder NullPointerException. Diese Exceptions erben von RuntimeException, was den Effekt hat, dass die Angabe in der Signatur nicht notwendig ist.



Die "Einteilung" steht in der Aufgabenstellung.

"geprüfte Ausnahme BufferFullException"
(ungeprüfte) "Ausnahme NullPointerException"


----------



## JavaIsTheBest (6. Jul 2016)

Warum wird in der Methode put eine  throws BufferFullException geworfen?
Es wird doch nirgendwo überprüft, ob der Buffer voll ist.

In der Aufgabe steht, wenn die Liste leer ist, dann wird eine NoSuchElementException geworfen. Das wird in der get Methode aber nicht gemacht und stattdessen eine BufferEmptyException geworfen.

Und warum wird in der Methode get() zweimal die BufferEmptyException geworfen?


----------



## JavaIsTheBest (6. Jul 2016)

Bitte diese Frage ist sehr wichtig


----------



## JCODA (6. Jul 2016)

JavaIsTheBest hat gesagt.:


> Warum wird in der Methode put eine  throws BufferFullException geworfen?
> Es wird doch nirgendwo überprüft, ob der Buffer voll ist.


Die spezielle Implementierung mit einer LinkedList erfordert das auch nicht, da sie sich automatisch vergrößert. D.h. hier gibt es keine feste maximale Größe. Theoretisch wird die Größe nur durch Deinen verfügbaren Arbeitsspeicher begrenzt.


JavaIsTheBest hat gesagt.:


> In der Aufgabe steht, wenn die Liste leer ist, dann wird eine NoSuchElementException geworfen. Das wird in der get Methode aber nicht gemacht und stattdessen eine BufferEmptyException geworfen.


Das stimmt wohl, Du möchtest nun allerdings nicht, dass eine NoSuchElem. Exep. geworfen wird, deswegen prüft man ja mit if (size()==0) ob die liste leer ist, falls ja wirft man eine BufferEmptyEcep.


JavaIsTheBest hat gesagt.:


> Und warum wird in der Methode get() zweimal die BufferEmptyException geworfen?


Das erste Mal steht dort "throws". Beachte das s am Ende. Das deutet darauf hin, dass die Methode diese Exception werfen kann. 
Später im Fall, dass die Liste leer ist, wirft man tatsächlich mit "throw new ...".


----------



## JavaIsTheBest (6. Jul 2016)

> Die spezielle Implementierung mit einer LinkedList erfordert das auch nicht, da sie sich automatisch vergrößert. D.h. hier gibt es keine feste maximale Größe. Theoretisch wird die Größe nur durch Deinen verfügbaren Arbeitsspeicher begrenzt.



Das heißt, man hätte das theoretisch auch weglassen können?



> Das stimmt wohl, Du möchtest nun allerdings nicht, dass eine NoSuchElem. Exep. geworfen wird



Warum sollte ich das nicht wollen? NoSuchElement bedeutet doch, dass kein Element vorhanden ist?


----------



## JCODA (6. Jul 2016)

JavaIsTheBest hat gesagt.:


> Das heißt, man hätte das theoretisch auch weglassen können?


Jein, wenn es "nur" diese Klasse geben würde, die das Interface implementiert: JA. 
Allerdings möchte man solch ein Interface allgemein gültig schreiben, deswegen kann es ja auch Beschränkte Buffer geben. 




JavaIsTheBest hat gesagt.:


> Warum sollte ich das nicht wollen? NoSuchElement bedeutet doch, dass kein Element vorhanden ist?



Aber du möchtest hier, dass die spezielle Implementierung des Interfaces durch die LinkedList nicht nach "außen" bekannt ist, außerdem kann es ja andere Buffer geben, die dann intern womöglich andere Exceptions nutzen, und mit dieser BufferEmptyExeption verallgemeinert man dies.


----------



## JavaIsTheBest (28. Jul 2016)

Warum sind diese zwei Programmblöcke dasselbe?



```
static void checked() throws FileNotFoundException{
FileReader r = new FileReader(new File(“C:/xxxxxx.doc”));
throw new NullPointerException();
}
```


```
static void checked() throws FileNotFoundException{
    try{
        FileReader r = new FileReader(new File(“C:/xxxxxx.doc”));
    }catch(FileNotFoundException e){
        throw e;
    }
    throw new NullPointerException();
}
```


----------



## Joose (28. Jul 2016)

`FileReader r = new FileReader(new File(“C:/xxxxxx.doc”));` diese Zeile kann eine FileNotFoundException werfen.

Beim 1.Code wird diese nicht behandelt und somit direkt weitergeworfen
Beim 2.Code wird mit try/catch die Exception gefangen. Im catch Block zum Behandeln der Exception steht aber nichts anderes drinnen als das die Exception weitergeworfen werden soll


----------

