Java—为什么Java.lang.RuntimeException或它的子类不强制我们在try/catch中编写代码
为什么Java—为什么Java.lang.RuntimeException或它的子类不强制我们在try/catch中编写代码,java,exception-handling,Java,Exception Handling,为什么java.lang.RuntimeException(或其子类)不强制我们在try/catch中编写代码 提供: public class ExceptionTest { public static void main(String[] args) { // HOW COMPILER COME TO KNOW or DECIDE THIS METHOD IS THROWING RuntimeException or Exception (Keep in mi
java.lang.RuntimeException
(或其子类)不强制我们在try/catch中编写代码
提供:
public class ExceptionTest
{
public static void main(String[] args)
{
// HOW COMPILER COME TO KNOW or DECIDE THIS METHOD IS THROWING RuntimeException or Exception (Keep in mind java.lang.RuntimeException is again extending java.lang.Exception)
new ExceptionTest().test_1();
}
public void test_1() throws MyException
{
}
}
class MyRuntimeRuntimeException extends RuntimeException
{
public MyRuntimeRuntimeException() {
// TODO Auto-generated constructor stub
}
}
class MyException extends Exception
{
public MyException() {
// TODO Auto-generated constructor stub
}
}
java.lang.Exception
或其子类(称为检查异常)强制
让我们在try/catch
块中编写代码或强制我们处理它
那么为什么java.lang.RuntimeException
或子类(称为未检查的异常)not强制我们在try/catch块中编写代码,即使它正在扩展java.lang.exception
添加示例:
public class ExceptionTest
{
public static void main(String[] args)
{
// HOW COMPILER COME TO KNOW or DECIDE THIS METHOD IS THROWING RuntimeException or Exception (Keep in mind java.lang.RuntimeException is again extending java.lang.Exception)
new ExceptionTest().test_1();
}
public void test_1() throws MyException
{
}
}
class MyRuntimeRuntimeException extends RuntimeException
{
public MyRuntimeRuntimeException() {
// TODO Auto-generated constructor stub
}
}
class MyException extends Exception
{
public MyException() {
// TODO Auto-generated constructor stub
}
}
这是Java语言设计的一部分。RuntimeException是代表程序员表示错误的异常,称为未检查异常。所有其他异常都是经过检查的异常,其目的是程序员必须显式地处理它们,要么捕获它们,要么在方法调用上用throws声明声明它们,让调用方知道它们可能被抛出。我认为它本身的定义已经足够清楚了
运行时异常意味着无法通过语法检查和代码的干执行预先确定,因此,编译器无法意识到在代码中的这一点上可能发生的错误。有可能引发某些异常的方法非常普遍,以至于如果可能引发异常的每个方法都需要声明它们,那么它们几乎会出现在所有的方法声明中。例如,任何使用引用访问对象成员的方法,在带有覆盖
NullPointerException
的catch的try块之外,都有可能抛出NullPointerException
在每个方法上声明NullPointerException
所传递的信息并不比在任何方法上声明它所传递的信息多,并且会使声明变得混乱
RuntimeException
系统避免用异常填充throws子句,这些异常可以到处抛出,并且很少被捕获。这是因为java编译器的设计知道,当有一个类在那个时候扩展时,它不会强制处理它。因为这些例外很难发生
因此,编译器本身就是为检查这种情况而设计的。请阅读这里。@Cube32我是在不同的上下文中问这个问题的。如果不在声明的注释中解释具体原因,我认为扩展RuntimeException不是一个好主意。没有回答这个问题。编译器也不能意识到I/O错误,但它们不是
运行时异常。
您的意思是编译器将检查是否存在自定义异常(IOException)是扩展RuntimeException还是Exception来强制try/cath?我已经编辑了quetion来添加示例,请看一看。@RakeshBhalani MyRuntimeException的声明确实需要一个注释来解释为什么它应该是RuntimeException。不必要地扩展RuntimeException会增加在应该捕获异常的方法中捕获异常失败的风险。