gpt4 book ai didi

java - 异常 - 检查和非检查异常类型

转载 作者:行者123 更新时间:2023-12-01 16:49:34 25 4
gpt4 key购买 nike

我有一个关于java.lang.Exception以及在 throw/throws 子句中考虑它的方式的问题。

我有以下 2 个示例,但我不完全理解 java.lang.Exception 是如何处理的:作为检查或未检查的异常。

以下方法编译成功:

public double method1() throws Exception {
return 0.7;
}
  • 在我看来,java.lang.Exception受到威胁java.lang.RuntimeExceptionjava.lang.Error。即使你不处理它,你也可以声明抛出它。
  • 如果我们使用受检查的异常(它们是 java.lang.Exception 的子类)而不是 Exception,那么您应该必须在方法体内有一个 throw 声明(或者调用抛出该已检查异常的方法)。对吗?

以下内容无法编译:

private void method2(int age) {
if (age > 30)
throw new Exception();
}
  • 这是我的困惑...如果它抛出 java.lang.RuntimeExceptionjava.lang.Error 类型的子类,它就会编译。
  • 为什么在这种情况下它不能编译?我猜这是因为它威胁 java.lang.Exception 作为受检查的异常。但如果是这样,那为什么 method1 能够编译呢?

谢谢你,路易莎

最佳答案

If it was throwing a subclass of type java.lang.RuntimeException or java.lang.Error it would had compiled?

是的,RuntimeException是未经检查的异常(或Error),因此您不需要在方法签名或catch上声明它明确地。例如,NullPointerException,您无法判断运行时代码中何时可能发生这种情况(即,由于哪个问题,因此,您不需要在任何地方显式处理它在代码内部),如果由于任何原因在运行时发生,您将看到异常堆栈跟踪。

但是,有一点是,您可以catch(如果需要)RuntimeException(使用catch)并处理它,如果您想要在引发异常时以不同的方式处理事情,你可以看看下面的内容。

try {
//some code
} catch(ArithmeticException exe) {
//handle it and you can do things differently how you like
}

此外,同样的规则也适用于 throws,即,如果您愿意,您可以指定 throws ArithmeticException (或方法签名上的任何 RuntimeException),但这对调用者没有任何影响,相反,它会使代码变得困惑,这不是最佳实践,您可以查看 here关于这一点。然而,当您在检查异常的方法上指定 throws caluse 时,调用者将被迫处理它,即调用者方法必须使用 catch block 显式处理它或再次抛出

why in this case it doesn't compile? I guess it is because it threats java.lang.Exception as a checked exception. But if it is so, then why method1 does compile?

是的,处理检查异常有两条规则:

(1) 使用 catch block 在方法内catch

(2) 或从方法中抛出(在方法签名中使用throws)

即,如果您的代码块抛出一个已检查的异常,那么您需要在方法内捕获它,否则该方法需要显式声明它抛出该异常 .

关于java - 异常 - 检查和非检查异常类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43222860/

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