Java 如何编写引发异常的方法头
假设FileInputStream的构造函数抛出FileNotFoundException,它是 异常情况下,为名为process的公共方法写入标头,该方法接受字符串参数 和不返回任何内容,其主体实例化FileInputStream对象,并且不包含 try-catch语句。“ 我知道这是一个太简单的问题,但我想确保我没有以愚蠢的方式搞砸。此外,不确定是使用FileNotFoundException还是仅使用Exception或IO等Java 如何编写引发异常的方法头,java,exception,methods,filenotfoundexception,fileinputstream,Java,Exception,Methods,Filenotfoundexception,Fileinputstream,假设FileInputStream的构造函数抛出FileNotFoundException,它是 异常情况下,为名为process的公共方法写入标头,该方法接受字符串参数 和不返回任何内容,其主体实例化FileInputStream对象,并且不包含 try-catch语句。“ 我知道这是一个太简单的问题,但我想确保我没有以愚蠢的方式搞砸。此外,不确定是使用FileNotFoundException还是仅使用Exception或IO等 public process(String file) thr
public process(String file) throws FileNotFoundException {
FileInputStream file = new FileInputStream("stuff.txt");
}
你所拥有的一切都是好的。抛出IOException并不可怕,但最好是具体的。调用代码仍然可以将其视为IOException 一般来说,除了特殊情况(Junit方法和类似情况,所有抛出的内容都会被异常处理程序捕获)之外,您不应该抛出异常,因为它会将调用它的所有内容强制置于处理异常的位置(在可能不适合这样做的地方,最好让大多数异常冒泡到一个可以统一处理的地方)或者也抛出异常,然后将其他调用方法置于相同的位置 您的方法声明无效,因为没有返回类型。不返回任何内容的方法声明的返回类型为void 将方法参数的名称与局部变量的名称相同是行不通的,您应该使它们有所不同。构造函数调用应该将方法参数作为参数(而不是硬编码字符串文字)。(+1到用于指出该名称,我错过了该名称。) 作为建议,如果代码使用反映变量内容的名称,则代码会更清晰。调用FileInputStream
文件
不清晰,最好将其称为inputStream
。调用字符串文件
不清晰,最好将其称为文件名
很好(除了缺少void
返回类型)
始终抛出(并捕获)最窄的
Exception规范(在本例中为FileNotFoundException
)。还添加void
作为返回类型。其余的就可以了。
public void process(String file) throws FileNotFoundException {
FileInputStream file = new FileInputStream("stuff.txt");
}
正如Nathan所发现的,您忘记声明process
不返回任何内容,也就是说,您忘记了void
关键字
您的参数字符串文件
(“重复的局部变量文件”)还有一个问题。您应该将其重命名为字符串文件名
,并将其传递给文件输入流的构造函数
:
public void进程(字符串文件名)抛出FileNotFoundException{
FileInputStream文件=新的FileInputStream(文件名);
}
关于一般主题,在调用引发异常的方法时,您始终必须做出选择:
- 您可以使用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对象引用的参数旁边的最后一个关键字。很好,我错过了关于方法参数和局部变量名的部分。我也错过了“void:)