2016-02-26 197 views
0

以下代碼會拋出NullPointerException,這不是由我的try catch處理的。爲什麼會這樣,我該如何處理這個異常?無法捕捉到異常

try 
{ 
    URL url = MyTestApp.class.getResource("deliberately_bad_path/icon.png"); 
    Image img = Toolkit.getDefaultToolkit().createImage(url); 
    ImageIcon icon = new ImageIcon(img); 
} catch (Exception e) 
{ 
    System.out.println("Okay it was an Exception"); 
    e.printStackTrace(); 
} catch (Throwable e) 
{ 
    System.out.println("Okay it was a throwable"); 
    e.printStackTrace(); 
} 

所以異常沒有被捕獲並顯示了下面的輸出:

未被捕獲的錯誤獲取圖像:
顯示java.lang.NullPointerException
在sun.awt.image.URLImageSource.getConnection (Unknown Source)
at sun.awt.image.URLImageSource.getDecoder(Unknown Source)
at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
在sun.awt.image.ImageFetcher.fetchloop(來源不明)
在sun.awt.image.ImageFetcher.run(來源不明)

+0

使用'test'而不是'url'來創建圖像是否正確? – josivan

+0

對不起,我在複製時重命名了一些內容,它只是一個錯字,現在會更正。 –

+0

他的'catch(Exception e)'應該抓住NullPointer嗎? – Ivaro18

回答

4

錯誤的原因是最有可能的是你通過一個空的URL Toolkit.createImage

該圖像加載完成於sun.awt.image.ImageFetcher。它運行在一個自己的線程(實際上它來自Thread),因此你的catch塊沒有趕上它的error

+0

好抓!如果我去堆棧跟蹤中提到的行,我可以看到'System.err.println(「Uncaught error fetching image:」);':) –

+0

有沒有辦法處理這個問題? –

+0

@AshleyMedway在將它傳遞給'createImage'之前總是檢查'url'是否爲空。如果Class.getResource找不到資源,則返回null。 - 因此還要檢查資源文件是否存在。 – wero