繁体   English   中英

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

[英]Does every exception have an required try-catch?

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

很多异常(IndexOutOfBoundException,ArithmeticException,IlligalArgumentException,NullPointerException)都表示他们不需要Exception,但是FileNotFoundException会这样做...而且我找不到答案,哪些不需要try-catch 。

对于您的异常,并不是绝对需要try/catch块。 相反,您可以throw它们throw能够正确处理异常的人。

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

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

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

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

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

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

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

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

检查异常是从java.lang.Exception继承的所有内容

未经检查的异常是从java.lang.RuntimeException继承的所有内容

错误是从java.lang.Error继承的所有内容

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

是的,但是如果您不想在方法中处理它,可以使用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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM