java:throws RuntimeException

spi*_*man 2 java

以下是如何正确的?我希望编译器告诉我使用throws Exceptionthrows RuntimeException

public void method1() throws NullPointerException { 

        throw new RuntimeException();
    }
Run Code Online (Sandbox Code Playgroud)

为什么我认为它不正确 - > Bcoz NPE是RTE,但RTE不是NPE

这怎么回事?我希望编译器告诉我使用throws Exceptionthrows RuntimeExceptionthrows NumberFormatException

public void method2() throws NullPointerException { 


    throw new NumberFormatException();
}


public void method3() throws Exception { // this is fine, as expected

        throw new RuntimeException();
    }


    public void method4() throws RuntimeException { // this is fine, as expected

        throw new NullPointerException();
    }

    public void method5() throws Exception { // this is fine, as expected

        throw new NullPointerException(); 
    }
Run Code Online (Sandbox Code Playgroud)

回答:

对于RTE即使你没有throws为方法添加子句,编译器也不会说什么

public void method6()  { // no compile time errors!!

        throw new NullPointerException(); 
    }
Run Code Online (Sandbox Code Playgroud)

但是当我们明确地说' throw new NullPointerException();'时,为什么编译器会忽略它?它与' throw new SQLException();' 相同 在运行时没有抛出一些对象被评估为null,并在该null对象上调用了一个动作.通常一个函数必须声明它可以抛出的所有异常,但是RTE正在绕过它!

RTE是未经检查的例外.但是当你说抛出新的RTE时,仍然没有检查?!

问题 - 这不是一个缺陷吗?或者请纠正我,理解为什么会这样

  • 更新:

请注意,此问题检查的异常和未经检查的异常之间的区别无关.问题不在于任何类型的异常或错误之间的区别.

问题是为什么没有处理显式标记的RunTimeException,或者没有强制编译器处理它.

例如:

public void methodA() { // methodA is not forced to handle the exception.
        methodB(); 
    }

    public void methodB() throws RuntimeException {

    }
Run Code Online (Sandbox Code Playgroud)

rpg*_*711 7

你误会了.

已检查的异常是在编译时检查的异常(因此它们的名称).因此,如果您有doFoo抛出异常的方法,则BarException必须声明该方法抛出BarException:

void doFoo() throws BarException { }
Run Code Online (Sandbox Code Playgroud)

未经检查的异常是编译器未检查的异常,因此您不必声明抛出异常

throw new Exception()只是抛出一个已检查异常的新实例,或者在RuntimeException的情况下取消选中.检查因子的情况仅在您使用该throw子句实际抛出已检查的异常时.

至于它是否是一个缺陷,现在这是一个非常自以为是的主题.使用抛出大量未经检查的异常的API而不记录它们抛出这些异常往往会令人讨厌.但是,有时可能会出现基于应用程序的唯一运行时状态而发生的异常,您无法声明可能会抛出某个已检查的异常,这就是运行时异常闪耀的地方(如NullPointerException)