Könnte mir bitte jemand einen Hinweis geben, warum dieses Anprobieren nicht funktioniert? Es wird eine Scannerausnahme ausgelöst, anstatt die erwartete Nachricht zu drucken.
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;
}
}
Einfach, das Programm löst ScannerException aus, Ihr try catch kann jedoch nur NumberFormatException abfangen. Sie müssen eine weitere catch-Klausel hinzufügen, um ScannerException abzufangen, oder nur die generische Ausnahme.
zum Beispiel, wenn Sie sagen:
} catch (NumberFormatException nfe) {
JOptionPane.showMessageDialog(null,"Input must be a number.");
}
das gibt nur an, wie NumberFormatException abzufangen ist.
Um alle Ausnahmen zu erfassen, müssten Sie Folgendes machen:
} catch (NumberFormatException nfe) {
JOptionPane.showMessageDialog(null,"Input must be a number.");
}catch (Exception e){
JOptionPane.showMessageDialog(null,"Generic exception caught");
}
In diesem Fall würde der zweite Catch alles erhalten, was nicht im ersten Catch erfasst wurde, da alle Ausnahmen die Exception-Klasse erweitern. Sie können alle abgeleiteten Klassen mit dieser Anweisung abfangen.
Da das Fangen von Exception an sich jedoch verpönt ist, können Sie auch Folgendes tun:
} catch (NumberFormatException, ScannerException e) {
JOptionPane.showMessageDialog(null,"Input must be a number.");
}
Beide Ausnahmen im selben Block abfangen.
Sie versuchen, eine NumberFormatException abzufangen. Sie müssen eine catch-Anweisung für eine ScannerException hinzufügen, da sich diese von einer NumberFormatException unterscheidet.
Sie müssen eine ScannerException oder ähnliches abfangen.
An diesem Code erfassen Sie nur die NumberFormatException .
Versuchen Sie etwas davon:
try {
...
} catch (NumberFormatException, ScannerException exception) {
JOptionPane.showMessageDialog(null,"Input must be a number.");
}
Sie erwischen die falsche Ausnahme.
Ihr Code löst keine NumberFormatException
aus. Sie sollten stattdessen eine InputMismatchException
abfangen.
Beim Betrachten von nextDouble
in Scanner
scheint es, dass der Scanner
-Code die NumberFormatException
für Sie behandelt und dann eine andere Art von Ausnahme auslöst:
von Java.util.Scanner
:
public double nextDouble() {
// Check cached result
if ((typeCache != null) && (typeCache instanceof Double)) {
double val = ((Double)typeCache).doubleValue();
useTypeCache();
return val;
}
setRadix(10);
clearCaches();
// Search for next float
try {
return Double.parseDouble(processFloatToken(next(floatPattern())));
} catch (NumberFormatException nfe) {
position = matcher.start(); // don't skip bad token
throw new InputMismatchException(nfe.getMessage());
}
}
Wenn Sie auf ein Problem wie dieses stoßen, empfehle ich Ihnen, die Java-Quelle als ersten Schritt durchzusehen. Es ist eine großartige Ressource.
Beachten Sie auch, dass es im JDK keine ScannerException
gibt.
Fangen Sie einfach InputMismatchException
anstelle von NumberFormatException
und alles funktioniert gut.
Warum nicht einfach:
String input = scan.nextLine();
if(!input.matches("\\d+")) { // regex for 1 or more digits
System.err.println("Input must be at least 1 digit!");
continue; // goes back to the top of the loop
}
double dbl = Double.valueOf(input);
Zu Ihrer Information, der eigentliche Regex für doppelte Genauigkeit wäre [digit] [.] [Digit], wobei [.] [Digit] optional ist.