Попробуйте / поймайте в Java - PullRequest
8 голосов
/ 15 января 2010

Может ли кто-нибудь дать мне подсказку, почему эта попытка и улов не работает? Выдает исключение сканера вместо печати ожидаемого сообщения.

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

Ответы [ 7 ]

21 голосов
/ 15 января 2010

Просто, программа выдает ScannerException, но ваш try catch может перехватывать только NumberFormatException, вам нужно добавить еще одно предложение catch для перехвата ScannerException или перехватить только общее Exception.

например, когда вы говорите:

 } catch (NumberFormatException nfe) {     
     JOptionPane.showMessageDialog(null,"Input must be a number.");
 }

, который только указывает, как перехватить NumberFormatException.
Чтобы перехватить все исключения, вам нужно сделать это:

 } catch (NumberFormatException nfe) {     
     JOptionPane.showMessageDialog(null,"Input must be a number.");
 }catch (Exception e){
     JOptionPane.showMessageDialog(null,"Generic exception caught");
 }

В этом случае второй перехват получит все, что не было перехвачено в первом перехвате, потому что все исключения расширяют класс Exception, вы можете перехватить все производные классы с помощью этого оператора.

Тем не менее, поскольку сам по себе перехват исключений исключен, вы также можете сделать:

 } catch (NumberFormatException, ScannerException e) {     
     JOptionPane.showMessageDialog(null,"Input must be a number.");
 }

Чтобы перехватить оба исключения в одном и том же блоке.

4 голосов
/ 15 января 2010

Вы пытаетесь поймать исключение NumberFormatException. Вам необходимо добавить оператор catch для ScannerException, так как он отличается от NumberFormatException.

2 голосов
/ 15 января 2010

Вам нужно поймать ScannerException или что-то подобное.

В этом коде вы только перехватываете NumberFormatException .

Попробуйте что-то вроде этого:

    try {
       ...
    } catch (NumberFormatException, ScannerException exception) {
       JOptionPane.showMessageDialog(null,"Input must be a number.");
    }
1 голос
/ 15 января 2010

Вы ловите неправильное исключение.

0 голосов
/ 15 января 2010

Почему бы просто не сделать:

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);

К вашему сведению, фактическое регулярное выражение для двойной точности будет [цифра] [.] [Цифра] с опцией [.] [Цифра].

0 голосов
/ 15 января 2010

Просто поймайте InputMismatchException вместо NumberFormatException и все работает отлично.

0 голосов
/ 15 января 2010

Ваш код не будет выбрасывать NumberFormatException. Вы должны поймать InputMismatchException вместо этого.

Глядя на nextDouble, в Scanner кажется, что код Scanner обрабатывает NumberFormatException для вас, а затем выдает исключение другого типа:

из 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());
    }
} 

Когда вы сталкиваетесь с такой проблемой, я рекомендую вам сначала просмотреть исходный код Java. Это отличный ресурс.

Также обратите внимание, что в JDK нет ScannerException.

...