auf variable im try block zugreifen?


18.07.2021, 11:47

try { 

int input = read.nextInt();

}

catch (java.util.InputMismatchException a) {

System.out.println("ERROR The token retrieved does not match the pattern for the expected type");

String eingabe = Integer.toString(input);

throw new WrongInputException(eingabe);

}

TechPech1984  18.07.2021, 11:44

du hast den code vergessen , jenachdem kann man entscheiden ...

Fritziiiiii 
Fragesteller
 18.07.2021, 11:47

ok jetzt


4 Antworten

Scanner.nextInt() wirft eben eine Exception, wenn es keinen Rückgabewert liefern kann. So funktioniert das also mal sicher nicht: es wird nie ein Wert an "input" zugewiesen, denn der Codeblock wird durch die Exception abgebrochen.

Ein übliches Muster ist, die auslösende Exception in der eigenen mitzugeben (als "cause"). Du kannst das beispielhaft hier sehen: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Exception.html#%3Cinit%3E(java.lang.String,java.lang.Throwable)

Ein anderer Ansatz wäre, vom Scanner einen String lesen zu lassen und diesen dann selbst in eine Zahl umzwandeln. Dann weißt du, was eingetippt wurde.


regex9  18.07.2021, 11:57

Eine Konversion in eine Zahl würde den Originalwert verfälschen. Letzten Endes erhält man so also nur die Information, dass die Konversion nicht erfolgreich war.

0

In der InputMismatchException, die von Scanner.nextInt() geworfen wird, stehen leider keine weiteren Informationen drin. Wenn du die Variable einfach als String einliest und sie dann mit Integer.parseInt() selbst umwandelst, kriegst du einerseits eine NumberFormatException, in der steht, was nicht umgewandelt werden konnte und andererseits hast du natürlich sowieso den Text, der eingegeben wurde.

public static void main(String[] args) {
	Scanner in = new Scanner(System.in);
	String numberString = in.next();
	
	try {
		int number = Integer.parseInt(numberString);
		System.out.println("Eingabe ist eine Zahl. Die Zahl ist: " + number);
	} catch (NumberFormatException e) {
		System.out.printf("Eingabe '%s' konnte nicht in eine Zahl gewandelt werden.", numberString);
	}
	in.close();
}

Wenn die InputMismatchException ausgelöst wird, bedeutet das auch, dass input undefiniert ist (zumal die Variable eh nur im try-Block bekannt ist, da sie nur in diesem deklariert wurde). Somit macht diese Zeile:

String eingabe = Integer.toString(input);

im catch-Block nicht viel Sinn. Zudem möchtest du doch über die Exception-Nachricht eigentlich die wirkliche Ursache für die Ausnahme herausfinden können. Dafür wäre der Originalwert, der tatsächlich in die Konsole eingegeben wurde, nützlich.

Also:

String eingabe = read.next();
import java.util.*;
public class MyClass {
   public static void main(String args[]) {
       Scanner read = new Scanner(System.in);
       int input = 0;
       try { 

           input = read.nextInt();

       }

       catch (java.util.InputMismatchException a) {

           System.out.println("ERROR The token retrieved does not match the pattern for the expected type");

           // String eingabe = Integer.toString(input);

           // throw new WrongInputException(eingabe);

       }
   }
}

eingabe : 1
ausgabe :
ende

-

eingabe: 1r
ausgabe : "Error ..."
ende