Try/catch in Java
Könnte bitte jemand mir einen Tipp geben, warum dieses try und catch nicht funktioniert?
Er wirft einen scanner Ausnahme statt drucken der Nachricht ich erwarte.
import java.util.*;
import java.io.*;
import java.math.*;
import javax.swing.*;
public class Main {
public static void main(String[] args) {
Boolean test = true;
while (test == true) {
try {
double x, y;
String operator;
Scanner scan = new Scanner(System.in);
Scanner scan_2 = new Scanner(System.in);
Scanner ScanOperator = new Scanner(System.in);
System.out.println(" Enter a double value: ");
x = scan.nextDouble();
System.out.println(" Enter another double value: ");
y = scan_2.nextDouble();
System.out.println(" Enter a operator for the operation you want to execute, or X if you want to quit: ");
operator = ScanOperator.nextLine();
if (operator.equals("x") || operator.equals("X")) {
test = false;
System.out.println("No calculation was made!!!");
}
System.out.println(Calculation(operator, x, y));
} catch (NumberFormatException nfe) {
JOptionPane.showMessageDialog(null,"Input must be a number.");
}
}
}
public static double Calculation(String operator, double x, double y) {
double result = 0;
double myAdd = 0;
double mySub = 0;
double myMult = 0;
double myDiv = 0;
double myPower = 0;
double myMod = 0;
if (operator.equals("+")) {
myAdd = x + y;
result = myAdd;
} else if (operator.equals("-")) {
mySub = x - y;
result = mySub;
} else if (operator.equals("*")) {
myMult = x * y;
result = myMult;
} else if (operator.equals("/")) {
myDiv = x / y;
result = myDiv;
} else if (operator.equals("^")) {
myPower = Math.pow(x, y);
result = myPower;
} else if (operator.equals("%")) {
myMod = x % y;
result = myMod;
} else {
}
return result;
}
}
- Was bedeutet die Ausnahme, sagen Sie ?
- Dieser code ist in Ordnung. Ich bin in der Lage zu laufen, wie es ist lokal.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfach, das Programm wirft ScannerException, aber try-catch können nur NumberFormatException fangen, müssen Sie einen anderen catch-Klausel, um zu fangen ScannerException, oder fangen nur die generische Ausnahme.
zum Beispiel, wenn Sie sagen:
ist nur die Angabe, wie die NumberFormatException zu fangen.
Um alle Ausnahmen abfangen, würden Sie brauchen, um machen es:
In diesem Fall wird der zweite catch-würde alles bekommen, das war nicht gefangen in der erste Haken, denn alle Ausnahmen erweitern der Exception-Klasse, Sie können fangen alle abgeleiteten Klassen mit dieser Aussage.
Jedoch, da Fang Ausnahme von selbst verpönt ist, Sie könnte auch tun:
Fangen beide Ausnahmen, die in dem gleichen block.
Den Sie versuchen zu fangen eine NumberFormatException. Müssen Sie fügen Sie einen catch-Anweisung für eine ScannerException, wie unterscheidet es sich von einer NumberFormatException.
Müssen Sie zu fangen ScannerException oder etwas wie dieses.
In diesem code sind Sie nur fangen die NumberFormatException .
Versuchen Sie etwas wie dieses:
catch (NumberFormatException, ScannerException e) {
Sie fangen die falsche Ausnahme.
Dein code wird nicht werfen eine
NumberFormatException
. Sollten Sie fangen einInputMismatchException
statt.Blick auf
nextDouble
imScanner
scheint es, dass dieScanner
code behandelt dieNumberFormatException
für Sie wirft und dann einen anderen Typ von Ausnahme:vom
java.util.Scanner
:Wenn Sie auf ein problem wie diesem, empfehle ich Ihnen, schauen Sie durch den Java-Quellcode als erste Station. Es ist eine großartige Ressource.
Beachten Sie auch, dass es keine
ScannerException
im JDK.Einfach fangen
InputMismatchException
stattNumberFormatException
und alles funktioniert einwandfrei.Warum nicht einfach tun:
Zur info, der eigentliche regex für doppelte Genauigkeit wäre [Zahl][.][Ziffer] mit der [.][Ziffer] optional sind.