2011-04-01 48 views
0

我寫了一個函數一樣爲什麼我收到錯誤如果我使用嘗試捕捉

public static boolean check()throws Exception 
{ 
    if(a=="asd") 
return true; 
else 
return false; 

} 

這工作得很好 但如果我使用

public static boolean check() 
{ 
try 
{ 
    if(a=="asd") 
return true; 
else 
return false; 
} 
catch(Exception e) 
{ 
} 
} 

它說你需要返回一個值,, ,,這兩個有什麼區別?

+2

在旁註中總是嘗試使用「asd」.equals(a)來比較兩個字符串,否則您將得到錯誤的結果。 – Pushkar 2011-04-01 07:29:17

+2

作爲一個方面說明,在實驗代碼中有空的catch塊是可以的,但是**不要在生產代碼中這樣做**(除非你或者你的隊友喜歡花費很長時間/晚的時間進行調試,嘗試找出神祕錯誤的根源,那就是)。 – 2011-04-01 07:30:47

回答

8

您需要在返回的東西,一種方法總是需要,除非你扔/ rethow異常返回的東西,甚至在抓,

5

是的,有區別。您的第二個代碼塊將捕獲任何異常從if聲明併吞下它,然後在catch塊之後繼續運行。但是那裏沒有return語句,所以如果有任何異常,函數將沒有返回值。

另一方面,第一個代碼塊使用throws來指示Exception後代可能會從中逃脫而不是被捕獲,因此它不需要自己捕獲和處理任何東西,並且編譯器準備允許函數不返回任何東西(由於從異常提前退出)。

0

並非代碼中的所有路徑都會返回一個值。由於你有一個catch,如果拋出一個異常,將不會返回任何值,因爲catch中的代碼將被執行。

0

我想你應該在函數結束後返回值。嘗試將結果存儲在一個布爾變量中,並在捕獲後返回該變量。這可能會解決你的問題

0

前提: a ==「asd」不是'錯誤',但可能最好使用a.equals(「asd」),因爲==比較指針而不是相等。例如(「asd」==「asd」)== false但是(「asd」.equals(「asd」))== false

如果if(a ==「asd」)拋出異常,流量進入捕獲狀態,然後退出而沒有發現返回語句。正確的代碼可以在catch塊中有return語句

+1

我想你的意思是''asd「==」asd「'是'true'而不是'false'。此外,''asd「.equals(」asd「)'也是'true'。 – Jesper 2011-04-01 07:32:48

+0

沒有那麼明確。不要使用== EVER字符串比較這是因爲實際的字符串指針不能保證是相同的。 「asd」==「asd」是新字符串(「asd」)==新字符串(「asd」)的快捷方式 並且您可以看到對象不同(因爲都是新的) 但是,如果您do:String a =「asd」; (a == a)== true,因爲你實例化「asd」只有一次,並重新使用指針 – Wishper 2011-04-01 07:37:21

+0

@Jesper好吧,第二個想法(我試過了) (「asd」==「asd」)== true 但這是一個非常糟糕的做法,因爲這種行爲並不能保證 – Wishper 2011-04-01 07:46:03

3

Java具有方法而不是函數。所以你沒有寫一個函數,而是一個方法。此外,比較字符串與==不適用於Java。你必須調用equals()方法代替:

if (a.equals("asd")) 

的問題在你的第二個代碼段是這樣的:如果發生異常,會發生什麼?執行catch塊的內容,之後執行該方法的其餘部分。請注意,catch塊後面沒有代碼。但該方法要求您返回boolean - 您錯過了return聲明。如下更改:

public static boolean check() 
{ 
    try 
    { 
     if (a.equals("asd")) 
      return true; 
     else 
      return false; 
    } 
    catch(Exception e) 
    { 
    } 

    // You need to add a return statement here 
    return false; 
} 

還有一些關於您的代碼的更多評論。

首先,將catch塊留空是個好主意。因爲當發現異常時,什麼都不會發生,你永遠不會知道發生了什麼問題。總是適當地處理異常。

而且,這樣的代碼:

if (a.equals("asd")) 
    return true; 
else 
    return false; 

可以簡化如下:

return a.equals("asd"); 

表達a.equals("asd")的結果已經是一個布爾值;爲什麼你會再次檢查它是真是假,然後返回真或假?

0

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; 
    } 
} 

注意:我沒有編譯或運行這些代碼,所以可能會出現拼寫錯誤。