2013-02-19 56 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块中声明,并且不会在其中显示。