在Java中何时需要添加抛出?
在下面的示例中,Eclipse没有要求我添加“抛出EmptyStackException”在Java中何时需要添加抛出?,java,exception,throws,Java,Exception,Throws,在下面的示例中,Eclipse没有要求我添加“抛出EmptyStackException” public E pop() { if (stack.isEmpty()) { throw new EmptyStackException(); } ... } 但是,在下面的示例中,需要“抛出异常” public E pop() throws Exception { if(stack.isEmpty()) { throw new Exception(); ... }
public E pop() {
if (stack.isEmpty()) {
throw new EmptyStackException();
}
...
}
但是,在下面的示例中,需要“抛出异常”
public E pop() throws Exception {
if(stack.isEmpty()) {
throw new Exception();
...
}
关于何时应该添加抛出,是否有任何特定规则?您不需要在方法签名中声明/处理
RuntimeException
s,但是,如果方法抛出了选中的异常而未在方法内部处理,则必须声明/处理选中的异常
在您的情况下,
EmptyStackException
是一个RuntimeException
,因此,您不需要在方法中处理/声明它,但Exception
是一个选中的异常,因此,您必须处理它或在方法签名中声明它EmptyStackException
extendsRuntimeException
,它是未检查的异常,而异常
是已检查的异常
Java只要求您捕获已检查的异常。您可以阅读更多关于这方面的内容。这就是和之间的区别 检查异常是方法签名的一部分,在使用方法时需要捕获或声明抛出该异常。它们是
Exception
本身的子类
一些示例包括扫描仪的特定构造函数
,或更正式的构造函数
选中的异常通常声明为抛出,因为可以从异常中恢复。例如,如果您要创建一个从文件中读取行的扫描仪
,而该文件不存在,那么除了要求他们重新指定位置之外,您还能合理地做些什么
例如:
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驱动的应用程序,则可以将这些运行时异常作为一个事件处理
还有错误
,这是未检查异常的一种特殊情况-您绝对不应该从中恢复过来,因为这表明JVM出现了非常非常严重的问题
例如,这是你不想看到的:
public void recurse() {
try {
recurse();
} catch (StackOverflowError e) {
System.out.println("We went in too deep.");
}
}
我建议您阅读关键词:选中与未选中异常。相关: