这是我的代码:
public static void main(String[] args) throws Exception {
Scanner s = new Scanner(new File("story.txt"));
someFunction(s);
}
story.txt
位于项目根目录中,但没有throws Exception
代码不会运行。
为什么呢?
答案 0 :(得分:6)
你不需要throws Exception
,但如果你这样做就不会有任何伤害。
您需要的是throws FileNotFoundException
,因为您使用的Scanner
构造函数被声明为抛出该异常,并且您没有捕获任何异常。
答案 1 :(得分:2)
你应该抛出FileNotFoundException
,因为Scanner
构造函数可以抛出一个。由于它是一个经过检查的异常,因此您必须将其传递到堆栈中或以某种方式处理它。
答案 2 :(得分:1)
我问我的教授,他解释说Java让你处理异常
如果函数可能抛出它们,您必须为它们做好准备。
您可以使用:
try {...
} catch { ...
}
自己处理例外,或者你可以使用:
throws Exceptions
“将它们传递到下一级别”(稍后处理它们)。
感谢您的帮助!
答案 3 :(得分:1)
如果方法或构造函数抛出的异常不是从RuntimeException
派生的,或者调用任何声明必须这样做的方法,那么它必须捕获该异常或声明该异常可能是抛出它。这种语言功能几乎是一件好事,但目前的形式已被广泛认为是一个错误。尽管如此,作为Java语言的一部分,它已经足够牢固地建立起来,它不会去任何地方。
从概念上讲,区分可能对方法的直接调用者具有特殊含义的异常和不具有特殊含义的异常是很好的。不幸的是,异常对其直接调用者具有特殊意义这一事实并不意味着直接调用者会对它感兴趣。 Java实现检查异常的方式,如果Foo
被声明为抛出已检查的异常而Bar
调用Foo
但是没有准备好处理该异常,则必须将自己声明为抛出异常异常(即使它不可能对其调用者有任何特殊含义),或者捕获它没有希望处理的异常(可能重新抛出作为从RuntimeException
派生的类型)。从RuntimeException
派生的类型捕获和重新抛出在语义上是最好的方法,但最终是最冗长的,特别是如果想要避免生成RuntimeException
个对象。
另请注意,因为链接构造函数调用无法封装在try
块中,所以通过声明为抛出任何异常的构造函数链接的任何构造函数都需要声明为抛出相同的构造函数例外。由于某种原因,事情以这种方式实现,但遗憾的是,类构造函数难以区分作为基类构造过程的一部分而抛出的异常以及在派生类的构造中抛出的异常。
答案 4 :(得分:0)
因为,Scanner s = new Scanner(new File("story.txt"));
会检查FileNotFoundException
。您应该throws
或catch
检查异常以进行编译。