Schnittstellen und Exceptions

JavaIsTheBest

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

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    54,1 KB · Aufrufe: 40

JCODA

Top Contributor
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

Bekanntes Mitglied
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?
 

Anhänge

  • 1.PNG
    1.PNG
    43,2 KB · Aufrufe: 32
  • 2.PNG
    2.PNG
    77,6 KB · Aufrufe: 32
  • 3.PNG
    3.PNG
    16,5 KB · Aufrufe: 34

JCODA

Top Contributor
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.
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.
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

Bekanntes Mitglied
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

Top Contributor
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.


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

Bekanntes Mitglied
Warum sind diese zwei Programmblöcke dasselbe?


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

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

Joose

Top Contributor
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
 

Neue Themen


Oben