Java:如何调用函数不处理子函数的异常?

时间:2011-09-27 02:59:16

标签: java exception

我了解到一个调用函数必须声明或处理被调用函数声明要抛出的所有异常。但是下面的代码可以编译。

public a() throws SipException, NullPointerException {
    try { }
    catch (SipException e) { throw e; }
    catch (Exception e) { throw new SipException("...", e); }
}
public b() throws SipException { a(); }

因为声明抛出NullPointerException,虽然它没有真正做到,但是如何才能忽略这个呢?

5 个答案:

答案 0 :(得分:4)

Java区分了必须声明或捕获的异常,或者那些不需要声明或捕获的异常。后者被称为未经检查的例外。

NullPointerException是一个未经检查的异常,不需要声明或捕获(因此您应该从throws行删除它。

考虑一下,空指针几乎可以在代码中的任何位置发生;如果你必须声明或捕获它们,每种方法都必须这样做。

this

  

那些未经检查的异常类,它们是错误类(错误   它的子类)免于编译时检查,因为   它们可以在程序的许多点上发生,并从中恢复   困难或不可能。宣布此类例外的计划将是   一尘不染,毫无意义。

答案 1 :(得分:2)

  

调用函数必须声明或处理被调用函数声明要抛出的所有异常。

此处的例外是RuntimeExceptions,您无需声明。 NullPointerException是一个RuntimeException。非RuntimeExceptions被称为“已检查的异常”(因为编译器会检查您是否考虑过它们)。

答案 2 :(得分:1)

查看Checked vs Unchecked Exceptions。 http://www.javapractices.com/topic/TopicAction.do?Id=129 NPE是一个未经检查的例外,想象一下程序的详细程度,如果一切都必须捕获或声明所有可能的异常!

RuntimeExceptions(未经检查的异常)是一个需要理解的关键概念。查看javadoc

答案 3 :(得分:1)

有两种主要的异常:RuntimeException和常规的普通旧异常。您只需要显式处理异常。 RuntimeExceptions可能会被忽略,并且会在堆栈中向上传播,就像在每个签名中写入“throws NullPointerException”一样。

关于何时使用每种类型,有各种各样的哲学。我赞成RuntimeExceptions应该表示编码错误的想法,而已检查的异常表示在正常运行的程序流中“预期”发生的问题。

答案 4 :(得分:1)

在Java中,有两种类型的异常不需要明确捕获:

  1. 任何延伸java.lang.Error
  2. 的例外情况
  3. 任何延伸java.lang.RuntimeException
  4. 的例外情况

    这两个例外用于表示表示致命错误的异常。无法从中找到无法恢复的错误,而程序员应该让程序失败。因此,语言允许您在这些情况下省略恼人的try {} catch {}样板。