Java 如何编写引发异常的方法头

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

假设FileInputStream的构造函数抛出FileNotFoundException,它是 异常情况下,为名为process的公共方法写入标头,该方法接受字符串参数 和不返回任何内容,其主体实例化FileInputStream对象,并且不包含 try-catch语句。“

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

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:)