未报告的异常java.io FileNotFoundException;必须被抓住或宣布被抛出

时间:2012-02-17 18:10:10

标签: java

我的客户代码:

public static void inputFiles()
{

  File inputFile = new File("colors2.txt");
  if (!inputFile.exists()) {  
        throw new FileNotFoundException(("File not found"));  
   }  
  ColorSet colorSetter = new ColorSet(inputFile);
}

我的供应商类构造函数:

public ColorSet(File source) throws FileNotFoundException
{
   if (!source.exists()) {  
        throw new FileNotFoundException(("File not found"));  
   }  
    colorInput = source;
}

我继续说 “未报告的异常java.io FileNotFoundException;必须被捕获或声明被抛出”

我尝试在客户端方法中捕获它,但它告诉我它不能在body块中调用,也许我做错了?

4 个答案:

答案 0 :(得分:2)

它抱怨的原因是它需要inputFiles() throws FileNotFoundException


那就是说,如果你在ColorSet的构造函数中有它,我很好奇你为什么需要它inputFiles,为什么inputFiles是复数,即使它只是输入一个文件。

您的备用解决方案不是抛出FileNotFoundException并在inputFiles方法中捕获ColorSet构造函数中的Exception。

答案 1 :(得分:2)

如果要在java中抛出已检查的异常,则需要在方法签名中声明它。此外,如果您调用抛出已检查异常的方法(或构造函数),那么您将需要在try-catch块中处理该异常,如:

try {
    ColorSet colorSetter = new ColorSet(inputFile);
} catch (FileNotFoundException fnfe) {
    // do something sensible with the exception.
}

如果要抛出运行时异常,则不需要声明方法会抛出它们。在这种情况下,我建议您使用IllegalArgumentException,因为您似乎正在检查提供给您的方法的参数是否有效。

另请注意,从构造函数中抛出异常通常被认为是不好的。认为这是更多的经验法则......

答案 2 :(得分:1)

inputFiles()必须声明它

答案 3 :(得分:0)

如前所述,您需要使用inputFiles()将其与当前方法一起抛出。

我建议,只需使用ColorSet的构造函数抛出异常,然后在inputFiles()中捕获异常,或者让inputFiles()将异常传递给它的调用者(在inputFiles()中没有文件检查代码方法)。此方法删除重复的代码,并确保在有人仍然创建ColorSet对象时抛出异常。