Jesper的回答幾乎涵蓋了它。我需要顯示一些代碼,因此這個單獨的答案。
您必須在每種情況下決定如何處理異常。 Jesper和LordSAK都選擇返回'假'。與此相關的問題是,您無法區分錯誤情況與「a」不等於「asd」的情況。
一個可能的解決方案是該方法的返回類型更改爲布爾(原始布爾的對象版本),並在情況下返回異常
public static Boolean check() {
try {
return "asd".equals(a);
}
catch(Exception e) {
return null;
}
}
另一種選擇是的「空」重新扔你除了作爲一個未經檢查的異常:
public static boolean check() {
try {
return "asd".equals(a);
}
catch(Exception e) {
throw new RuntimeException("Problem during check", e);
}
}
這種方法的缺點是,代碼調用您的支票()方法不指望一個運行時異常被拋出。由於這種類型的異常未經檢查,如果開發人員沒有用try-catch包圍調用check()的話,他將不會收到編譯器警告。
第三個選擇是聲明異常並讓你的調用代碼處理它。一個完整的例子:
import org.apache.log4j.Logger;
public class Checker {
private static final Logger LOG = Logger.getLogger(Checker.class);
private String a;
public Checker(String value) {
a = value;
}
public boolean check() throws Exception {
return "asd".equals(a);
}
public static void main(String[] args) {
Checker app = new Checker("Stackoverflow");
try {
app.check();
}
catch(Exception e) {
LOG.error("Problem during check", e);
}
}
}
一個優點是,你沒有決定哪些值檢查()返回一個錯誤的情況,而是你剛纔返回錯誤本身。這實際上是'拋出'例外的整個想法。作爲一個經驗法則:如果你不能在方法本身內處理異常,那麼拋出它並讓調用代碼處理它。
來自野外的一個例子:處理異常本身的方法。
private static final long DEFAULT_TIMEOUT = 60000;
public long getTimeout(String timeoutArg) {
try {
return Long.parseLong(timeoutArg);
}
catch(NumberFormatException e) {
return DEFAULT_TIMEOUT;
}
}
注意:我沒有編譯或運行這些代碼,所以可能會出現拼寫錯誤。
在旁註中總是嘗試使用「asd」.equals(a)來比較兩個字符串,否則您將得到錯誤的結果。 – Pushkar 2011-04-01 07:29:17
作爲一個方面說明,在實驗代碼中有空的catch塊是可以的,但是**不要在生產代碼中這樣做**(除非你或者你的隊友喜歡花費很長時間/晚的時間進行調試,嘗試找出神祕錯誤的根源,那就是)。 – 2011-04-01 07:30:47