Hi Leute!
Versuche mich gerade erstmals an Exceptions, deswegen bitte keine blöden Sprüche falls ich irgend einen total dämlichen Fehler eingebaut haben sollte, ich finde ihn auf jeden Fall nicht. Für Hinweise/hilfreiche Antworten bin ich sehr dankbar Der Code soll zwei integer addieren und bei der Eingabe von Buchstaben, Kommazahlen o.ä. eine Exception werfen.
Java:
package except1;importjava.util.Scanner;publicclass index {publicstaticvoidmain(String[] args){System.out.println("Addition zweier integer Zahlen!");System.out.println("Bitte erste Zahl eingeben");try{get();//Einlesen der Zahlen durch die Methode "get"}catch(fehlor e){System.out.println(e.getMessage());//Text aus Klasse "fehlor" wird ausgegeben}}publicstaticvoid get ()throws fehlor
{int x,y;Scanner sc =newScanner(System.in);
x=sc.nextInt();if(x !=(int)x)thrownewfehlor();//Wenn die Eingabe kein int ist, soll Fehler geworfen werdenSystem.out.println("Bitte zweite Zahl eingeben");
y=sc.nextInt();if(y !=(int)y)thrownewfehlor();//Wenn die Eingabe kein int ist, soll Fehler geworfen werdenaddi(x,y);}publicstaticvoid addi (int x,int y){
x=x+y;System.out.print("Das Ergebnis der Addition lautet: ");System.out.print(x);}}
Und hier noch die Klasse fehlor, welche sich in einer externen Datei befindet:
Java:
publicclass fehlor extendsException{fehlor(){super("Oops! Das war aber kein Integer!");}}
Mal abgesehen davon bin ich auch gar nicht sicher ob ich richtig verstanden habe, was Zeile 16 tut - hab sie einfach aus einem anderen Beispiel übernommen. Soweit ich das verstanden habe, wird die Exception (eingabe!=int) einfach "e" genannt und mit getMessage der Text aus der Unterklasse ausgegeben (also super("Dieser Text wird ausgegeben"))
public int nextInt()
Scans the next token of the input as an int.
An invocation of this method of the form nextInt() behaves in exactly the same way as the invocation nextInt(radix), where radix is the default radix of this scanner.
Returns:
the int scanned from the input
Throws:
InputMismatchException - if the next token does not match the Integer regular expression, or is out of range
NoSuchElementException - if input is exhausted
IllegalStateException - if this scanner is closed
Also wird da eine Exception geworfen, wenn beispielsweise Kommazahlen oder Buchstaben kommen, nämlich InputMismatchException.
ints sind Ganzzahlen. Du nimmst da eine Zahl, die bereits eine Ganzzahl ist, castest sie zu einer Ganzzahl und fragst nun, ob sie sich verändert hat. Direkt darüber ließt du dein x und y ein und ließt genau nur Ganzzahlen ein (kann also nur eine Ganzzahl sein) und dann weißt du es einer Variable vom typ int zu (wird dann zu einer Ganzzahl).
Ok!
Ich wollte das Beispiel nur aus Übungszwecken machen um mal eine eigene Exception auszuprobieren. Mir war schon klar, dass automatisch eine Exception geworfen wird, sobald man einen nicht-int Wert eingibt aber ich dachte es wäre vll. möglich diese Exception mit meiner eigenen auszutauschen.
Aber scheinbar geht das nicht, da die Eingabe ein int SEIN MUSS wenn die Schleife überhaupt bis zu meiner eigenen Exception-Abfrage gelangen würde. Richtig?
Aber scheinbar geht das nicht, da die Eingabe ein int SEIN MUSS wenn die Schleife überhaupt bis zu meiner eigenen Exception-Abfrage gelangen würde. Richtig?
Wenn du dir InputMismatchException genauer ansiehst, bemerkst du, dass es letztendlich eine RuntimeException ist. Diese musst du nicht behandelt, KANNST es aber.
Also kannst du eine catch-Block bauen, der die Exception behandelt und darin dann in deine eigene Exception umwandeln und die werfen.
Ist dann aber bei dir eine sogenannte Checked-Exception und dann MUSS man sich um die Behandlung kümmern.
Das ist ein sehr kontroverses Thema in Java, ob Checked-Exception überhaupt Sinn machen oder nicht. Jedenfalls gibt es eine Meinung das die allermeisten Exceptions RuntimeException sein sollten und daher ist dein Ansatz genau umgekehrt und somit kontraproduktiv.
Alles klar, dann werd ich mir mal ein paar andere Aufgabenstellungen zum Rumprobieren aussuchen - will ja erstmal den Syntax richtig rein kriegen, war halt ne doofe Idee eine Exception zu einer bereits bestehenden Exception zu schreiben.
Vielen Dank für die ausführlichen Antworten!