如何编写抛出异常的方法 header

How to write a method header that throws exception

"鉴于 FileInputStream 的构造函数抛出 FileNotFoundException,它是 异常,为一个名为 process 的 public 方法编写 header,它接受一个 String 参数 并且 returns 什么都没有,并且其 body 实例化了一个 FileInputStream object 并且不包含 try-catch 声明。

我知道这是一个 too-simple 问题,但我想确保我没有以愚蠢的方式搞砸。另外,不确定是使用 FileNotFoundException 还是仅使用 Exception 或 IO 等

public process(String file) throws FileNotFoundException {

    FileInputStream file = new FileInputStream("stuff.txt");
}

throws 子句的内容很好。抛出 IOException 并不可怕,但最好具体一些。调用代码仍然可以将其视为 IOException。

通常你不应该抛出 Exception 除非特殊情况(Junit 方法和类似的情况,所有抛出的东西都会被异常处理程序捕获),因为它强制所有调用它的东西进入处理 Exception 的位置(其中这可能不是合适的地方,最好让大多数异常冒泡到一个可以统一处理的地方)或者也抛出异常,然后将其他调用方法放在相同的位置。

您的方法声明无效,因为没有 return 类型。不 return 任何东西的方法用 return 类型的 void 声明。

对方法参数使用与局部变量相同的名称是行不通的,您应该使它们不同。构造函数调用应将方法参数作为参数(而不是硬编码字符串文字)。 (+1 到 指出那个,我错过了那个。)

作为建议,如果您的代码使用反映变量内容的名称,它会更清晰。调用一个FileInputStreamfile不清楚,不如调用inputStream。调用一个Stringfile不太清楚,不如调用filename.

您拥有的很好(除非您缺少 void return 类型)。

始终抛出(并捕获)最窄的 Exception 规范(在本例中为 FileNotFoundException)。

同时添加 void 作为 return 类型。 好好休息

public void process(String file) throws FileNotFoundException {

    FileInputStream file = new FileInputStream("stuff.txt");
}

正如 Nathan 所发现的,您忘记声明 process returns 什么都没有,也就是说,您忘记了 void 关键字。

您的参数 String file ("duplicate local variable file") 存在另一个问题。您应该将其重命名为 String filename 并将其传递给 FileInputStream:

的构造函数
public void process(String filename) throws FileNotFoundException {
    FileInputStream file = new FileInputStream(filename);
}

关于一般话题,当你调用一个抛出异常的方法时,你总是要做出选择:

  • 您可以使用 try/catch 块并处理调用方法中的错误(例如记录它们);

  • 您可以在方法声明中使用 throws 关键字传播异常。

所以你在这里做的是第二种可能性。

您可以通过购买意外误用保险来改进您的方法:

public void process(final String file) throws FileNotFoundException {

    final FileInputStream inputStream = new FileInputStream("stuff.txt");
    //invoke operations on inputStream object
    //After 100 lines of code
    inputStream = new FileInputStream("foo.txt"); // compile error
}

观察传递给方法和 FileInputStream 对象引用的参数旁边的 final 关键字。