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