wake-up-neo.com

Versuchen Sie/fangen Sie in Java

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;
    }
}
8
Tony

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.

21
zmbush

Sie versuchen, eine NumberFormatException abzufangen. Sie müssen eine catch-Anweisung für eine ScannerException hinzufügen, da sich diese von einer NumberFormatException unterscheidet.

4
Jeff

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.");
    }
2
Pedro Ghilardi

Sie erwischen die falsche Ausnahme.

1
Anon.

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.

0
akf

Fangen Sie einfach InputMismatchException anstelle von NumberFormatException und alles funktioniert gut.

0
Thunderhashy

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.

0
Droo