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

आप नंबरफॉर्मेट अपवाद को पकड़ने का प्रयास कर रहे हैं। आपको ScannerException के लिए कैच स्टेटमेंट जोड़ने की आवश्यकता है, क्योंकि यह संख्याफॉर्मेट अपवाद से अलग है।

+0

जावा – Thunderhashy

2

आपको स्कैनरएक्सप्शन या कुछ ऐसा करने की आवश्यकता है।

इस कोड पर आप केवल नंबरफॉर्मैट अपवाद पकड़ रहे हैं।

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

में कोई स्कैनर अपवाद नहीं है अगर मैं गलत हूं, तो मुझे क्षमा करें, लेकिन यह नहीं होना चाहिए: 'पकड़ (संख्याफॉर्मेट अपवाद, स्कैनरएक्सप्शन ई) {' – zmbush

+0

आप सही हैं। मेरी गलती। =) –

+0

हम उसी कैच ब्लॉक में 2 अपवाद कैसे प्राप्त कर सकते हैं? – Thunderhashy

21

सरल, कार्यक्रम ScannerException फेंकता है, लेकिन अपने कोशिश पकड़ केवल NumberFormatException पकड़ कर सकते हैं, आपको एक अन्य पकड़ खंड जोड़ने के लिए ScannerException पकड़ने, या पकड़ने केवल सामान्य करने की जरूरत है:

इस तरह की कुछ प्रयास करें अपवाद।

उदाहरण के लिए

, आप जब कहते हैं:

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

इस मामले में, दूसरा पकड़ सब कुछ है कि पहले पकड़ नहीं कर दिया गया है क्योंकि सभी अपवाद अपवाद वर्ग का विस्तार मिलता है, आप चाहते हैं उस कथन के साथ सभी व्युत्पन्न कक्षाओं को पकड़ सकते हैं।

हालांकि, बाद से ही अपवाद को पकड़ने पर सिकोड़ी है, तो आप भी कर सकता है:

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

एक ही ब्लॉक में दोनों अपवाद को पकड़ने के लिए।

+1

हालांकि मैं उस विशिष्ट अपवाद को पकड़ने की अनुशंसा करता हूं जिसे आप पकड़ना चाहते हैं - इस मामले में एक स्कैनर अपवाद - एक सामान्य अपवाद पकड़ने के बजाय। लेकिन यह सही है। – aperkins

+0

धन्यवाद। यह वास्तव में सहायक था! – Tony

+0

मेरा निजी पसंदीदा पकड़ है (थ्रोबल टी) – 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()); 
    } 
} 

जब आप एक समस्या मारा इस तरह, मैं अनुशंसा करता हूं कि आप जावा स्रोत को पहले स्टॉप के रूप में देखें। यह एक महान संसाधन है।

यह भी ध्यान दें कि जेडीके में ScannerException नहीं है।

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

FYI करें, डबल परिशुद्धता के लिए वास्तविक regex होगा [अंकों] के साथ [अंकों] [अंकों] वैकल्पिक जा रहा है [।] [।]।

संबंधित मुद्दे