gpt4 book ai didi

java - Java中什么时候需要添加 throws?

转载 作者:行者123 更新时间:2023-12-01 06:52:11 25 4
gpt4 key购买 nike

在下面的示例中,Eclipse 不会要求我添加“抛出 EmptyStackException”

public E pop() {
if (stack.isEmpty()) {
throw new EmptyStackException();
}
...
}

但是,在以下示例中,需要“抛出异常”

public E pop() throws Exception {
if(stack.isEmpty()) {
throw new Exception();
...
}

对于何时应该添加抛出或不添加抛出有任何具体规则吗?

最佳答案

这就是checked exceptions之间的区别和 unchecked exceptions .

检查异常是方法签名的一部分,需要在使用该方法时捕获或声明抛出。它们是 Exception 的子类他们自己。

一些示例包括 Scanner 的特定构造函数,或更正式地说, Scanner#<init>(File file) .

检查异常通常被声明为抛出,因为可以从异常中恢复。例如,如果您要创建 Scanner从文件中读取行,而该文件不存在,除了要求他们重新指定位置之外,您还能合理地做什么?

一个例子:

Scanner sc = new Scanner(System.in);
boolean found = false;
String path = sc.nextLine();
while(!found) {
try {
sc = new Scanner(new File(path));
found = true;
} catch (FileNotFoundException e) {
System.out.println(path + " was not valid. Please try again.");
path = sc.nextLine();
}
}

未经检查的异常不是方法签名的一部分,并且可能因任何特定原因而引发。它们是 RuntimeException 的子类.

您最常遇到的情况之一是 NullPointerException 。这种特殊的异常可能以最无害的方式发生,例如:

Integer i = null;

System.out.println(i + 2); // NPE on unboxing

通常不希望人们能够从异常中恢复;用外行的话来说,关于代码流的假设出了问题。也就是说,写这个几乎肯定有代码味道:

Integer i = null;
try {
System.out.println(i + 2);
} catch(NullPointerException e) {
System.out.println("i was null!?");
}

大多数现代框架将允许您指定应用程序在发生此类错误时进入的特定状态 - 如果它是 Web 驱动的应用程序,您可以将此类运行时异常作为 500 进行处理。

还有Error ,这是未经检查的异常的一种特殊情况 - 您绝对不能从中恢复,因为它表明 JVM 出现了非常非常严重的错误。

例如,这是您不希望看到的:

public void recurse() {
try {
recurse();
} catch (StackOverflowError e) {
System.out.println("We went in too deep.");
}
}

关于java - Java中什么时候需要添加 throws?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22440498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com