每个例外都有必要的试用吗?

时间:2015-04-24 15:16:37

标签: java exception try-catch

一个简单的问题,我无法找到答案。 Java中的每个异常都需要使用try-catch吗?或者仅适用于FileNotFoundException?

许多异常(IndexOutOfBoundException,ArithmeticException,IlligalArgumentException,NullPointerException)都表示他们不需要Exception,但FileNotFoundException会这样做...而且我无法找到答案不需要试一试。

6 个答案:

答案 0 :(得分:42)

并非绝对需要为您的例外设置try/catch块。相反,您可以throw将他们发送给能够正确处理异常的人。

有两种例外:已选中和未选中。 Checked异常可以被视为编译器找到的异常,并且编译器知道它有可能发生,因此您需要catchthrow它。例如,打开文件。它有可能失败,编译器知道这一点,所以你被迫catchthrow可能的IOException

未经检查的异常可被视为有可能发生的异常,但根据您的代码,编译器并不知道。换句话说,它是编程错误。例如,如果您正在接受用户输入并期望一个数字,并且用户输入了您不期望的内容(例如字符串),则您的程序将抛出NumberFormatException。您可以预测这些方案并将try/catch尝试在它们发生之前避免它们。很少见到一个人添加throws NullPointerExceptionthrows NumberFormatException(或抛出任何其他未经检查的异常)。这是允许的,但明确地创建该异常是很奇怪的,并且大多数人会说它的编码风格很差。

请注意,所有已检查的建议必须才会被捕获或抛出可以处理它的内容;如果你不这样做,你的程序就不会编译。如果你把它扔到无法处理的东西上,那么你的程序如果发生就会崩溃。

另请注意,未经检查的异常(例如:在运行时发生的异常,通常是通过错误的用户输入或诸如此类)也会导致程序崩溃。因此,当某些内容可能出错时使用try/catch通常是个好主意,但您不必

另外值得注意的是,Checked异常是Exception的子类,而Unchecked异常是RuntimeException的子类,RuntimeException本身是Exception的子类。这意味着如果你真的想要,一个try {} catch (Exception e) {}将捕获你的程序可能抛出的每个异常。当然,这被认为是处理异常的可怕方式,您应该分别捕获每个异常,以便您可以单独处理它们。请尽量不要使用它。

答案 1 :(得分:2)

不,并非每个例外都需要try-catch。每个检查过的异常都需要try catch。例如,NullPointerException是一个未经检查的异常,因此它不需要try-catch,而是检查FileNotFoundException,因此它确实需要一个。您还可以在方法签名中添加“throws”,从而避免使用try-catch。

答案 2 :(得分:1)

读: https://docs.oracle.com/javase/tutorial/essential/exceptions/

基本上已检查异常需要处理或抛出 可以处理或抛出未经检查的异常和错误(尽管处理错误通常被视为不良做法)。

Checked exception是从java.lang.Exception

继承的所有内容

未经检查的异常是从java.lang.RuntimeException

继承的所有内容

错误是从java.lang.Error

继承的所有内容

答案 3 :(得分:0)

只有Checked异常显式需要捕获它,对于其他所有类型的异常,您可以使用“throws”方法签名。

答案 4 :(得分:0)

是的,但如果您不想在方法中处理它,可以使用throws关键字将异常传递给方法的调用方。例如:

void execption() throws Exception {
    throw new Exception();
}

void caller() {
    try {
        execption();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

编辑:我的java上有点生疏,就像josh说你可以拥有不需要像NullPointerException这样的try / catch的未经检查的异常,但如果你认为一个未经检查的异常,你可以添加一个可能会被抛出。例如:

Object obj = null;

obj.hashCode();// if you think a NPE will be thrown you can use a try/catch here

答案 5 :(得分:0)

当您调用的方法显式抛出异常时,您必须使用try....catch循环。但是,如果您给出的列表都是运行时异常。当有时某个程序有不期望的输入或程序被用于某些不适合的用途时,它们会被抛出。这些不需要try....catch循环。