【问题标题】:How to write a method header that throws exception如何编写抛出异常的方法头
【发布时间】:2015-03-06 13:06:47
【问题描述】:
"鉴于 FileInputStream 的构造函数抛出 FileNotFoundException,它是
例外,为一个名为 process 的公共方法编写标头,该方法采用 String 参数
并且什么都不返回,其主体实例化了一个 FileInputStream 对象并且不包含
一个 try-catch 语句。”
我知道这是一个过于简单的问题,但我想确保我不会以愚蠢的方式搞砸。另外,不确定是使用 FileNotFoundException 还是只使用 Exception 或 IO 等。
public process(String file) throws FileNotFoundException {
FileInputStream file = new FileInputStream("stuff.txt");
}
【问题讨论】:
标签:
java
exception
methods
filenotfoundexception
fileinputstream
【解决方案1】:
throws 子句的内容很好。抛出 IOException 并不可怕,但最好具体一点。调用代码仍然可以将其视为 IOException。
除了特殊情况(Junit 方法和抛出的所有东西都会被异常处理程序捕获的类似情况),通常你不应该抛出异常,因为它会强制所有调用它的东西进入处理异常的位置(它可能不是合适的地方,最好让大多数异常冒泡到一个可以统一处理的地方)或者抛出异常,然后将其他调用方法放在同一位置。
您的方法声明无效,因为没有返回类型。不返回任何内容的方法声明为返回类型为 void。
对方法参数使用与局部变量相同的名称是行不通的,您应该使它们不同。构造函数调用应该将方法参数作为参数(而不是硬编码字符串文字)。 (+1 到 geceo's answer 指出那个,我错过了那个。)
建议您的代码使用反映变量内容的名称会更清晰。调用 FileInputStream file 不清楚,最好叫它inputStream。调用字符串file不清楚,最好叫filename。
【解决方案2】:
您所拥有的一切都很好(除非您缺少 void 返回类型)。
始终抛出(并捕获)Exception 的最窄规范(在本例中为 FileNotFoundException)。
【解决方案3】:
正如 Nathan 所发现的,您忘记声明 process 什么也不返回,也就是说,您忘记了 void 关键字。
您的参数String file(“重复的局部变量文件”)还有另一个问题。您应该将其重命名为String filename 并将其传递给FileInputStream 的构造函数:
public void process(String filename) throws FileNotFoundException {
FileInputStream file = new FileInputStream(filename);
}
关于一般主题,当您调用抛出异常的方法时,您总是必须做出选择:
- 您可以使用 try/catch 块并处理调用方法中的错误(例如记录错误);
或
- 您可以在方法声明中使用
throws 关键字传播异常。
所以你在这里做的是第二种可能性。
【解决方案4】:
还添加void 作为返回类型。 休息很好。
public void process(String file) throws FileNotFoundException {
FileInputStream file = new FileInputStream("stuff.txt");
}
【解决方案5】:
您可以通过购买意外误用保险来改善您的方法:
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 关键字。