8

Ai đó có thể vui lòng cho tôi một gợi ý tại sao thử và bắt này không hoạt động? Nó ném một ngoại lệ máy quét thay vì in tin nhắn tôi mong đợi.Hãy thử/bắt trong Java

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

Ngoại lệ cho bạn biết điều gì? – nos

+0

Mã này là tốt. Tôi có thể chạy nó vì nó là cục bộ. – Thunderhashy

Trả lời

1

Bạn đang gặp ngoại lệ sai.

4

Bạn đang cố gắng nắm bắt một NumberFormatException. Bạn cần phải thêm một câu lệnh catch cho một ScannerException, vì nó khác với một NumberFormatException.

+0

Không có ScannerException trong Java – Thunderhashy

2

Bạn cần phải nắm bắt ScannerException hoặc một số tương tự.

Tại mã này, bạn chỉ bắt được NumberFormatException.

Hãy thử một số như thế này:

try { 
     ... 
    } catch (NumberFormatException, ScannerException exception) { 
     JOptionPane.showMessageDialog(null,"Input must be a number."); 
    } 
+0

Tha thứ cho tôi nếu tôi sai, nhưng không nên là: 'catch (NumberFormatException, ScannerException e) {' – zmbush

+0

Bạn nói đúng. Lỗi của tôi. =) –

+0

làm thế nào chúng ta có thể bắt được 2 ngoại lệ trong cùng một khối catch? – Thunderhashy

21

đơn giản, chương trình ném ScannerException, nhưng catch của bạn chỉ có thể bắt NumberFormatException, bạn cần phải thêm một mệnh đề catch để bắt ScannerException, hoặc bắt chỉ generic Ngoại lệ.

ví dụ, khi bạn nói:

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

mà chỉ được quy định cụ thể như thế nào để bắt NumberFormatException.
Để bắt tất cả các trường hợp ngoại lệ, bạn sẽ cần phải làm cho nó:

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

Trong trường hợp này, sản lượng đánh bắt thứ hai sẽ nhận được tất cả những gì đã không được đánh bắt ở bắt đầu bởi vì tất cả trường hợp ngoại lệ mở rộng các lớp ngoại lệ, bạn có thể bắt tất cả các lớp có nguồn gốc với câu lệnh đó.

Tuy nhiên, kể từ khi bắt ngoại lệ bởi bản thân không được tán thành, bạn cũng có thể làm:

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

Để bắt cả hai trường hợp ngoại lệ trong cùng một khối.

+1

Mặc dù tôi khuyên bạn nên bắt ngoại lệ cụ thể mà bạn muốn nắm bắt - trong trường hợp này là ngoại lệ của Máy quét - thay vì bắt ngoại lệ chung. Nhưng điều này là chính xác. – aperkins

+0

cảm ơn bạn. Nó thực sự hữu ích! – Tony

+0

Yêu thích cá nhân của tôi là bắt (Throwable t) – Andres

0

Mã của bạn sẽ không ném NumberFormatException. Thay vào đó, bạn nên bắt một số InputMismatchException.

Nhìn vào nextDouble, trong Scanner, có vẻ như rằng mã Scanner xử lý các NumberFormatException cho bạn và sau đó ném một loại khác nhau của ngoại lệ:

từ 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()); 
    } 
} 

Khi bạn nhấn một vấn đề như thế này, tôi khuyên bạn nên xem qua nguồn Java như một điểm dừng đầu tiên. Đó là một nguồn tuyệt vời.

Cũng lưu ý rằng không có ScannerException trong JDK.

+0

cảm ơn bạn. Nó thực sự hữu ích! – Tony

0

Chỉ cần bắt InputMismatchException thay vì NumberFormatException và mọi thứ đều hoạt động tốt.

+0

có hoạt động tốt khi bạn nhập chữ thay vì số ở đầu vào không? – akf

+0

Tất nhiên là không. Mã không bắt được ngoại lệ đúng. – Thunderhashy

0

Tại sao không chỉ làm:

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

FYI, regex thực tế cho độ chính xác gấp đôi sẽ là [chữ số] [chữ số] với [chữ số] là tùy chọn [.] [.].