Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—为什么Java.lang.RuntimeException或它的子类不强制我们在try/catch中编写代码_Java_Exception Handling - Fatal编程技术网

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会增加在应该捕获异常的方法中捕获异常失败的风险。