8

Qualcuno potrebbe darmi un suggerimento perché questo tentativo di cattura non funziona? Genera un'eccezione scanner invece di stampare il messaggio che mi aspetto.Prova/cattura 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

Cosa ti dice l'eccezione? – nos

+0

Questo codice va bene. Sono in grado di eseguirlo come è localmente. – Thunderhashy

risposta

1

Stai riscontrando l'eccezione sbagliata.

4

Si sta tentando di catturare un NumberFormatException. È necessario aggiungere un'istruzione catch per un'eccezione ScannerException, poiché è diversa da NumberFormatException.

+0

Non c'è ScannerException in Java – Thunderhashy

2

È necessario prendere uno ScannerException o alcuni come questo.

A questo codice si sta rilevando solo il numero NumberFormatException.

Provate un po 'come questo:

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

Perdonami se ho torto, ma non dovrebbe essere: 'catch (NumberFormatException, ScannerException e) {' – zmbush

+0

Hai ragione. Errore mio. =) –

+0

come possiamo catturare 2 eccezioni nello stesso blocco di cattura? – Thunderhashy

21

semplice, il programma tiri ScannerException, ma il pescato prova può prendere solo NumberFormatException, è necessario aggiungere un'altra clausola catch al fine di catturare ScannerException, o prendere solo il generico Eccezione.

ad esempio, quando si dice:

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

che è solo specificando come catturare NumberFormatException.
Per raggiungere tutte le eccezioni, si avrebbe bisogno di farlo:

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

In questo caso, il secondo fermo otterrebbe tutto ciò che non è stato catturato nel primo fermo, perché tutte le eccezioni estendono la classe Exception, è può prendere tutte le classi derivate con quella dichiarazione.

Tuttavia, dal momento che la cattura delle eccezioni di per sé è visto di buon occhio, si potrebbe anche fare:

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

di catturare sia le eccezioni nello stesso blocco.

+1

Sebbene raccomandi di rilevare l'eccezione specifica che si desidera rilevare, in questo caso un'eccezione dello scanner, anziché un'eccezione generica. Ma questo è corretto. – aperkins

+0

grazie. E 'stato davvero utile! – Tony

+0

Il mio preferito è catch (Throwable t) – Andres

0

Il tuo codice non getterà un NumberFormatException. Dovresti invece prendere uno InputMismatchException.

Guardando nextDouble, in Scanner, sembra che il codice Scanner gestisce la NumberFormatException per voi e poi getta un diverso tipo di eccezione:

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

Quando si colpisce un problema In questo modo, ti consiglio di guardare attraverso il Java source come prima tappa. È una grande risorsa.

Si noti inoltre che non vi è ScannerException nel JDK.

+0

grazie. E 'stato davvero utile! – Tony

0

Basta prendere InputMismatchException anziché NumberFormatException e tutto funziona correttamente.

+0

funziona bene quando si digitano lettere anziché numeri ai prompt di input? – akf

+0

Ovviamente no. Il codice non sta prendendo la giusta eccezione. – Thunderhashy

0

Perché non basta fare:

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

Cordiali saluti, l'espressione regolare effettivo per la doppia precisione sarebbe [cifre] [cifre] con il [cifre] è facoltativo [.] [.].