2013-02-19 55 views
0

我繼承了一些編譯時出錯的代碼。我得到兩個錯誤之一:其中一個,return聲明丟失,或另一個我有不匹配的throw/try/catch。這個錯誤似乎是與return聲明的位置有關,我一直在整個上午都在移動。其當前位置收益率爲error: missing return statement。任何被註釋掉的回報都會產生一條消息,我必須聲明trycatch與我的throwJAVA:爲什麼在編譯期間返回錯誤?

考慮:

static private List<File> getFileListingNoSort(File aDirectory) throws FileNotFoundException { 

try { 
    List<File> result = new ArrayList<File>(); 
    File[] filesAndDirs = aDirectory.listFiles(); 
    List<File> filesDirs = Arrays.asList(filesAndDirs); 
    for(File file : filesDirs) { 
     result.add(file); //always add, even if directory 
     if (! file.isFile()) { 
       List<File> deeperList = getFileListingNoSort(file); 
       result.addAll(deeperList); 
      // return result; 
     } //close if 
     // return result; 
    } // close for 
    } // close try for getFileListingNoSort 
    // return result; 
catch (Exception exp) { 
     System.err.println("Error: " + exp.getMessage()); 
} //close catch getFileListingNoSort 
return result; 
} //close method 

認爲的回報將在嘗試後去的,但趕上了。但是,這並不適合我。我不是很確定爲什麼我要得到這些地區,除了誤解節目如何與try/catch流動。有人能告訴我最合適的迴歸地點,並解釋原因嗎?

回答

3

您的方法必須通常返回ALWAYS,或者發出異常。

如果您的catch子句未拋出Exception,則需要使用return語句作爲捕獲的最後一條語句或捕獲後語句。

當你想返回try塊以外的東西時,它的值必須定義之前你試一試。

舉例來說,如果你想在try返回一些值(如果一切順利的話),以及空,如果你得到一個異常,你的代碼會是這個樣子:

try{ 
    ... do loads of stuff 
    return value; 
} catch(Exception e) { 
    e.printStackTrace(); //log it, whatever 
    return null; 
} 
4

而不是

try { 
    List<File> result = new ArrayList<File>(); 

List<File> result = new ArrayList<File>(); 
try { 

這樣的變量result不會超出範圍的try/catch塊之後。

該列表將包含添加到發生異常的每個元素。

2

您正在定義result在您的try塊內,但(嘗試)將其返回到塊外。這是行不通的,因爲變量超出了範圍。解決這個問題的最簡單方法是在try塊之外聲明結果變量。

1

result在try塊中,並且可能未初始化。把它放在try塊之外可以解決你的問題。

1

首先,您試圖訪問result變量,該變量在try塊中聲明,並且不會在其中顯示。