java:抛出运行时异常

标签 java

下面的说法正确的是?我希望编译器告诉我使用 throws Exceptionthrows RuntimeException

public void method1() throws NullPointerException { 

        throw new RuntimeException();
    }

为什么我认为它不正确 -> 因为 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(); 
    }

答案:

对于 RTE,即使您不添加 throws方法的子句,编译器不会说什么

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

        throw new NullPointerException(); 
    }

但是当我们明确地说“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 {

    }

最佳答案

你误会了。

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

void doFoo() throws BarException { }

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

throw new Exception()仅仅抛出一个已检查异常的新实例,或者在 RuntimeException 的情况下抛出未检查的异常。仅当您实际使用 throw 抛出已检查异常时,才会考虑检查因素。条款。

至于它是否是一个缺陷,现在这是一个非常固执己见的话题。使用抛出大量未经检查的异常而不记录它们抛出这些异常的 API 往往是相当烦人的。但是,有时可能会出现基于应用程序的独特运行时状态而发生的异常,在这种情况下,您无法声明可能抛出某个已检查的异常,而这正是运行时异常的亮点(例如 NullPointerException )

关于java:抛出运行时异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22996407/

相关文章:

java - Netbeans 调试器无法调试具有特定类名的任何项目

java - 读取外部属性文件 Java/Linux

java - 如果一个类被卸载并再次加载,静态 block 会被调用两次吗?

java - 无法编译的源代码 : Erroneous Sym Error

java - java中的Hash Map与LinkedList

java - 通过 Arrays.copyOf() 生成的二维数组副本中的更改反射(reflect)在原始数组中

java.util.List 是一个接口(interface),JAXB 不能处理接口(interface)

java - Java 中的 Spring 配置 - 创建和使用 2 个相同类的 bean 不使用 Autowired

java - 如何在 spring bean 上强制/验证 spring 范围注释

java - JScience 5.0 示例