2015-11-06 58 views
0

有人能告訴我爲什麼只有catch子句中的消息框FileNotFoundException即使在異常是IO-或JDOMException時也顯示出來?爲什麼java忽略這些catch子句中的相關消息框? thx!多個catch子句,每個都有自己的消息框

public void SetWurzel() { 
     builder = new SAXBuilder(); 
     xmlFile = new File(Pfad); 
     try { 
      document = (Document) builder.build(xmlFile); 
     } 
      catch (FileNotFoundException e){ 
       JOptionPane 
       .showMessageDialog(
         null, 
         "Die Datei konnte nicht gefunden werden. Bitte überprüfen Sie den Pfad" 
         + " auf Korrektheit."); 
      }catch (IOException e) { 
       JOptionPane 
       .showMessageDialog(
         null, 
         "Bitte prüfen Sie die Zugriffsrechte auf Ihre Datei und geben " 
         + "Sie diese gegebenenfalls frei. "); 
     } catch (JDOMException e) { 
      JOptionPane 
      .showMessageDialog(
        null, 
        "Bitte Prüfen Sie die Struktur der einzulesenden XMLDatei auf Fehlern" 
        + " und fehlende Elemente."); 
     } 
     Wurzel = document.getRootElement(); 
    } 
+0

你是說當在'try'塊中拋出JDOMException時,最後一個'catch'似乎沒有被執行?你有調試執行嗎? –

+0

假設我有一個xml文件。由於一些訪問權限或更改權限,我無法讀取該文件,並期望看到IOException。所以我也期待看到相關的消息框。取而代之的是FileNotFoundException的catch子句中的消息框,這是沒有意義的。因爲路徑是正確的,並且文件在那裏。 JDOMException也是如此。 – melar

+0

是的,它是有道理的:看看@ rolfl的答案:catch塊不會按順序執行,而是按優先級執行。而'FileNotFoundException'意味着文件不存在或者由於某種原因無法訪問。 –

回答

2

FileNotFoundException是,in fact, an IOException(它的一個子類)。因此,由於您首先指定了FileNotFound catch塊,如果找不到該文件,並且引發了該異常,則會首先捕獲該文件。

一旦異常由該catch塊處理,try/catch塊將完成,並且您的代碼將繼續執行。

請注意,catch塊不會「級聯」......完成第一個catch塊不會啓動下一個.....只有第一個可以處理異常的catch塊被執行。

因此,如果發現IOException不是FileNot,則第二個catch塊將運行。

如果XML解析或文檔結構中存在異常,則JDOMException處理程序將運行。

只有其中一個會在發生異常時運行......這就是Java的工作方式。

+0

THX! 'cascade'是def。關鍵詞在這裏.. – melar

相關問題