8

누군가이 시도와 잡기가 작동하지 않는 이유를 알려주시겠습니까? 예상 한 메시지를 인쇄하는 대신 스캐너 예외가 발생합니다.자바에서 시도/잡기

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

예외가 무엇입니까? – nos

+0

이 코드는 문제가 없습니다. 로컬로 실행할 수 있습니다. – Thunderhashy

답변

1

잘못된 예외가 있습니다.

4

NumberFormatException을 catch하려고 시도하고 있습니다. NumberFormatException과 다른 ScannerException에 대한 catch 문을 추가해야합니다.

+0

Java에 ScannerException이 없습니다. – Thunderhashy

2

ScannerException 또는 일부를 catch해야합니다.

이 코드에서는 NumberFormatException 만 잡습니다.

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

내가 잘못하면 용서해주세요.하지만 그렇게해서는 안됩니다 :'catch (NumberFormatException, ScannerException e) {' – zmbush

+0

맞습니다. 내 실수. =) –

+0

동일한 catch 블록에서 2 개의 예외를 어떻게 잡을 수 있습니까? – Thunderhashy

21

간단한이 프로그램은 ScannerException을 던졌습니다하지만, 당신이 ScannerException를 잡아, 또는 단지 일반을 잡으려고 위해 다른 캐치 절을 추가 할 필요가 당신의 시도 캐치는 NumberFormatException이 잡을 수 :

이 같은 일부 시도 예외. 예를 들어

, 당신은 말할 때 : 단지는 NumberFormatException를 잡는 방법을 지정하는 것입니다

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

. 모든 예외를 포착하기 위해
, 당신이 그것을 할 필요가 :

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

를이 경우, 두 번째 캐치 당신은 모든 예외는 예외 클래스를 확장하기 때문에 처음 캐치에 걸려되지 않은 모든 것을 얻을 것이다 해당 문으로 모든 파생 클래스를 catch 할 수 있습니다. 자체적으로 예외를 잡기하는 것은 눈살을 찌푸리게하고 있기 때문에

그러나, 당신은 또한 할 수있는 :

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

은 같은 블록에서 모두 예외를 포착하십시오.

+1

일반적인 예외 잡기 대신 특정 예외 (예 : 스캐너 예외)를 잡는 것이 좋습니다. 그러나 이것은 맞습니다. – aperkins

+0

감사합니다. 그것은 정말로 도움이되었다! – Tony

+0

내 개인적으로 좋아하는 것은 catch (Throwable t) – Andres

0

코드가 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 소스를 처음 보게 될 것을 권장합니다. 그것은 훌륭한 자원입니다.

또한 ScannerException이 JDK에 없습니다.

+0

감사합니다. 그것은 정말로 도움이되었다! – Tony

0

그냥 NumberFormatException 대신 InputMismatchException을 잡으면 모든 것이 정상적으로 작동합니다.

+0

입력 프롬프트에서 숫자 대신 문자를 입력하면 제대로 작동합니까? – akf

+0

물론 아닙니다. 코드가 올바른 예외를 잡지 못하고 있습니다. – Thunderhashy

0

왜 그냥하지 :

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

참고로, 배정 밀도의 실제 정규식 [숫자]이 될 것와 [숫자] [숫자] 옵션 인 [.] [합니다.].