2012-01-26 15 views
18

मैं किसी समस्या को हल करने के लिए अपने आवेदन में मैं इस कोडexception.getMessage() वर्ग के नाम के साथ उत्पादन

try { 
    object1.method1(); 
} catch(Exception ex) { 
    JOptionPane.showMessageDialog(nulll, "Error: "+ex.getMessage()); 
} 

और object1 ऐसा ही कुछ करना होगा है कोशिश कर रहा हूँ,:

public void method1() { 
    //some code... 
    throw new RuntimeException("Cannot move file"); 
} 

मैं इस तरह मेरे विकल्प फलक में एक पृष्ठभूमि में मिलती है: Error: java.lang.RuntimeException: Cannot move file

लेकिन मैं getMessage और नहीं toString विधि, इसलिए वर्ग श के नाम का इस्तेमाल किया प्रकट नहीं होगा, है ना?

मैं क्या गलत कर रहा हूं? मैंने पहले से ही बहुत सारे अपवादों का प्रयास किया है, यहां तक ​​कि Exception भी। मैं अपने Exception सबक्लास

समस्या को हल करने की आवश्यकता के बिना इस नंबर को हल करने के लिए देख रहा हूं - सबको धन्यवाद!

ट्राई एवं कैच वास्तव में प्राप्त() जो मेरे अपवाद के साथ एक ExecutionExceptiondoInBackground() से फेंका निर्माण करती SwingWorker से विधि में बुलाया जा रहा था मैं यह कर निश्चित:

@Override 
protected void done() { 
    try { 
     Object u = (Object) get(); 
     //do whatever u want 
    } catch(ExecutionException ex) { 
     JOptionPane.showMessageDialog(null, "Error: "+ex.getCause().getMessage()); 
    } catch(Exception ex) { 
     JOptionPane.showMessageDialog(null, "Error: "+ex.getMessage()); 
    } 
} 
+1

अजीब लगता है - आप इस एक छोटा लेकिन पूरा कार्यक्रम में पुन: पेश कर सकते हैं? –

+0

क्या आप 'e.printStackTrace()' साथ ही 'पकड़ 'में जोड़ सकते हैं? ऐसा लगता है कि @ डेकवे सही है। –

+0

स्टैक ट्रेस को देखते हुए मैं देख सकता हूं कि समस्या स्विंग वर्कर हो सकती है ....... कोशिश {} वास्तव में स्विंग कार्यकर्ता विधि() से प्राप्त() को कॉल कर रही है और अपवाद को डिनबैकग्राउंड – fredcrs

उत्तर

24

मैं लगता है कि आप अपने अपवाद को एक और अपवाद में लपेट रहे हैं (जो उपरोक्त आपके कोड में नहीं है)। यदि आप इस कोड को आज़माते हैं:

public static void main(String[] args) { 
    try { 
     throw new RuntimeException("Cannot move file"); 
    } catch (Exception ex) { 
     JOptionPane.showMessageDialog(null, "Error: " + ex.getMessage()); 
    } 
} 

... आप एक पॉपअप देखेंगे जो वास्तव में आप क्या चाहते हैं।


हालांकि, आपकी समस्या (लपेटा हुआ अपवाद) को हल करने के लिए आपको "सही" संदेश के साथ "रूट" अपवाद प्राप्त करने की आवश्यकता है। ऐसा करने के लिए आप एक खुद पुनरावर्ती विधि getRootCause बनाने की जरूरत:

public static void main(String[] args) { 
    try { 
     throw new Exception(new RuntimeException("Cannot move file")); 
    } catch (Exception ex) { 
     JOptionPane.showMessageDialog(null, 
             "Error: " + getRootCause(ex).getMessage()); 
    } 
} 

public static Throwable getRootCause(Throwable throwable) { 
    if (throwable.getCause() != null) 
     return getRootCause(throwable.getCause()); 

    return throwable; 
} 

नोट: इस तरह unwrapping अपवाद हालांकि, प्रकार के अनुसार इसका सारांश टूट जाता है। मैं आपको यह जानने के लिए प्रोत्साहित करता हूं कि अपवाद क्यों लपेटा गया है और अगर यह समझ में आता है तो खुद से पूछें।

+0

आपकी getRootCause विधि अनंत रिकर्सन के विरुद्ध सुरक्षित नहीं है। – Perception

+0

@ धारणा, जब तक फेंकने योग्य स्वयं के कारण के रूप में नहीं है या आपके पास कुछ अन्य अजीब चक्रीय श्रृंखला हैं, तो आपको इसके बारे में चिंता करने की आवश्यकता नहीं है। – aioobe

+0

@aioobe - सच है, यह जांचने के प्राथमिक कारण हैं। लेकिन यह उतना ही दुर्लभ नहीं है जितना आप सोच सकते हैं। – Perception

5

मेरा अनुमान है कि आपको method1 में कुछ मिला है जो दूसरे में एक अपवाद लपेटता है, और नेपर के संदेश के रूप में नेस्टेड अपवाद के toString() का उपयोग करता है। मेरा सुझाव है कि आप अपनी परियोजना की प्रतिलिपि लें, और समस्या को बनाए रखते हुए जितना हो सके उतना हटा दें, जब तक कि आपके पास एक छोटा लेकिन पूरा प्रोग्राम न हो जो इसे प्रदर्शित करता हो - उस बिंदु पर या तो यह स्पष्ट हो जाएगा कि क्या हो रहा है, या हम इसे ठीक करने में मदद करने के लिए एक बेहतर स्थिति में होंगे।

यहाँ एक छोटा लेकिन पूरा कार्यक्रम जो RuntimeException.getMessage() दर्शाता है ठीक प्रकार से व्यवहार है:

public class Test { 
    public static void main(String[] args) { 
     try { 
      failingMethod(); 
     } catch (Exception e) { 
      System.out.println("Error: " + e.getMessage()); 
     } 
    }  

    private static void failingMethod() { 
     throw new RuntimeException("Just the message"); 
    } 
} 

आउटपुट:

Error: Just the message 
संबंधित मुद्दे