2011-03-29 98 views
0

如果我寫這樣的代碼:關於產品的try catch語句

Document d = searcher.doc(docId); 
d.get("latitude") 

我得到

unreported exception ... must be caught or declared to be thrown 

如果我寫這篇文章,

try { 
    Document d = searcher.doc(docId); 
} 
d.get("latitude") 

我顯然得到:

cannot find symbol 
symbol : variable d 

如果我寫這篇文章

Document d; 
try { 
d = searcher.doc(docId); 
} 
d.get("latitude"); 

我得到這個:

variable d might not have been initialized 

因爲我不想try/catch語句擴展到所有的文件我怎麼能解決這個問題呢?

感謝

回答

4
Document d = null; 

,而不是僅僅

Document d; 

雖然那麼你不必擔心NullPointerException異常後在路上,當你使用d

2

你這樣做有消息說什麼: 只需在開頭初始化變量「d」爲空:

Document d = null; 
try { 
    d = searcher.doc(docId); 
} 
d.get("latitude"); 

無論如何,要小心!如果發生異常,你的「d」變量將爲空,你將得到一個對象引用而不是異常! 在try塊中包含d.get("latitude");或在調用該行之前檢查null。

3

嘗試:

Document d = null; 
try { 
    d = searcher.doc(docId); 
    d.get("latitude"); 
} 
0

應該是:

Document d = null; 
try { 
    d = searcher.doc(docId); 
} catch (Exception e) { 
    //... 
} 
d.get("latitude"); 
+0

如果catch語句本身不會拋出異常,則d可能爲空 – Adi 2011-03-29 22:45:00

+0

我知道,那麼我們將會有NPE,它顯示不正確的應用程序狀態 – smas 2011-03-29 22:58:18

0

你只需把它初始化爲空,但是你不應該在我看來。

如果該方法拋出一個異常,那麼d == null,所以你需要處理這種情況,if (d != null)或只是範圍d在try塊內。

我會做後者。

1

您應該初始化變量並捕獲異常(您可以根據需要更改異常名稱並獲取消息級別)。

Document d = null; 
try { 
    d = searcher.doc(docId); 
    d.get("latitude"); 
} catch (Exception ex){ 
    ex.getMessage(); 
} 
0

如果你釣到的魚會導致跳過(通過退貨或throw語句)的方法的其餘部分,或者如果你在catch初始化d,你不應該得到這個錯誤。 。

Document d; 
try { 
    d = searcher.doc(docId); 
} catch (SomeException e) { 
    return null; 
    //throw new RuntimeException(e); 
    //d = some default value 
} 
d.get("latitude"); 

剛剛初始化d = null時,只會在發生異常時導致空指針(模糊實際原因)。