这个问题在这里已经有答案了:
java返回值(在try/catch子句中)(6个答案)
上个月关门了。
package asasaSASA;
import java.io.*;
class FileInputTest {
public static FileInputStream f1(String fileName) {
try {
FileInputStream fis = new FileInputStream(fileName);
System.out.println("f1: File input stream created");
return fis; // I HAVE RETURN fis
}
catch (FileNotFoundException e) {
System.out.println("에러는"+e);
}
}
public static void main(String args[]) {
FileInputStream fis1 = null;
String fileName = "foo.bar";
System.out.println("main: Starting " + FileInputTest.class.getName()
+ " with file name = " + fileName);
fis1 = f1(fileName);
System.out.println("main: " + FileInputTest.class.getName() + " ended");
}
}
我想让这个代码运行,但它说
此方法必须返回fileinputstream类型的结果
我不明白,因为我回来了 fis
. 为什么上面说你必须回去?我已经退了!
3条答案
按热度按时间vof42yt11#
异常处理就是问题所在。这是一种常见但糟糕的代码风格:每当您捕获到异常时,正确的做法是要么处理该异常,要么确保您(重新)抛出某个异常。
记录下来,还是打印出来?这不是在处理异常。
在这种情况下,“找不到文件”不是您需要处理的;除非你详细说明什么
f1
应该这样做(提示:方法应该更具描述性)。因此,扔东西是公平的游戏。此外,定义f1
(大概是;这个名字并不特别有启发性,而且这个方法没有文档)表明“打开这个文件”是它的一个基本方面,因此,抛出一个FileNotFoundException
也是公平的。因此:
最佳解决方案
注:你的psv主可以(通常应该!)宣布
throws Exception
.交替拍摄
这一点在任何你不能做到的情况下都适用
throws
异常,或者如果添加签名没有意义,因为它反映了实现细节,而不是方法尝试执行的固有方面:当然,这只适用于在正常情况下确实不希望出现异常的情况。否则,要么向前抛出该异常,要么创建自己的异常类型并抛出该异常,而不是
RuntimeException
.如果你只是需要一个¯(ツ)/¯ 我真的不知道这意味着什么,我只想继续,摆脱这些异常解决方案:
throw new RuntimeException("Uncaught", e);
是正确的;e.printStackTrace();
不正确。更新ide的模板。2hh7jdfx2#
您的方法抛出一个选中的异常,该异常必须在方法内部或外部处理。选中的异常表示可能发生问题,您需要实现一些东西来处理此场景。这里我们担心文件不存在。
您有三个选择:
为不存在的文件返回和处理值(此处不引发异常)。所以要么返回null,然后签入
main()
inputstream不为null,或者返回可选的<>,这是处理此类场景的jdk8方法。例子:
将选中的filenotfoundexception Package 到自定义runtimeexception中。这将解决您的编译错误问题,但如果您在某个地方无法捕获此异常,则将来可能会出现问题。
例子:
将此异常添加到方法签名,而不是try catch:
例子:
但是如果您在某个时候在方法中声明了一个选中的异常,您将不得不捕获它并处理它。
方案3是最理想的。
neekobn83#
如果上面的线抛出
FileNotFoundException
接下来要执行的代码行是也就是说它绕过了你的
return
语句,这就是为什么会出现编译器错误。有许多不同的方法来修复编译器错误,其他答案解释了不同的方法。我只是回答你的问题,即
为什么上面说你必须回去?
我希望你现在明白为什么你说的是错的
我已经退了!