2012-01-15 83 views
1

我想從下面的方法返回一個字符串。如何返回try/catch語句中的字符串?

public String openCon() { 
    try { 
     Scanner scan = new Scanner(System.in); 
     URL sitex = new URL("http://" + scan.nextLine()); 
     URLConnection connection = sitex.openConnection(); 
     Object content = sitex.getContent(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(sitex.openStream())); 
     String str; 
     String x = "1"; 
     while ((str = in.readLine()) != null) { 
      x += str; 
     } 
     in.close(); 
     return x; 

    } 
    catch(Exception e) { 
     System.out.println(e); 
    } 
} 
+2

這是什麼問題? – talnicolas 2012-01-15 16:51:42

回答

13

這個問題不從try塊返回 - 問題是,你是,如果一個異常被拋出不返回任何東西。你正在捕捉異常......但是在不返回任何東西的情況下到達方法的結尾。 (說得更多的技術術語:非空方法到底應不應該到達。)

個人而言,我只是刪除catch塊完全,並添加throws聲明對這些內拋出的異常身體。你不是真的處理的例外 - 你只是打印出來,忽略它們,這是一個很好的主意。捕捉Exception通常是一個非常糟糕的主意開始。

順便說一句,你應該finally塊所以他們即使在異常關閉的情況下關閉BufferedReaderURLConnection值。我還建議將固定編碼名稱傳遞給InputStreamReader,或者使用更高級別的HTTP客戶端API,它將使用響應中的內容類型標頭。哦,並且在循環中使用StringBuilder而不是字符串連接。

+0

你正在離開我們其餘的人不多評論:-) – Robin 2012-01-15 17:16:41

1

如果在return語句之前有一個異常,該方法不會返回任何東西。既然你沒有真正處理這個異常,我建議你讓它在更高的層次上冒泡並處理它。如果沒有更好的地方,這可能是主要的方法。您需要將方法聲明爲throws IOException,並可能添加其他異常類。

此外,請使用try-with-resources確保您的實例(BufferedReaderInputStreamReader)正確關閉。

1

爲什麼不在try語句之前初始化該變量,並在它之後放置return語句?

0

你應該在catch塊返回的東西,例如:

catch(Exception e) { 
     System.out.println(e); 
     return ""; 
    } 
0

用途:

String result = "" 
try{ 
    result = "OK"; 
}catch (Exception e){ 
    result = e.toString(); 
}finally{ 
    return result; 
}