一个简单的问题,我无法找到答案。 Java中的每个异常都需要使用try-catch吗?或者仅适用于FileNotFoundException?
许多异常(IndexOutOfBoundException,ArithmeticException,IlligalArgumentException,NullPointerException)都表示他们不需要Exception,但FileNotFoundException会这样做...而且我无法找到答案不需要试一试。
答案 0 :(得分:42)
并非绝对需要为您的例外设置try/catch
块。相反,您可以throw
将他们发送给能够正确处理异常的人。
有两种例外:已选中和未选中。 Checked异常可以被视为编译器找到的异常,并且编译器知道它有可能发生,因此您需要catch
或throw
它。例如,打开文件。它有可能失败,编译器知道这一点,所以你被迫catch
或throw
可能的IOException
。
未经检查的异常可被视为有可能发生的异常,但根据您的代码,编译器并不知道。换句话说,它是编程错误。例如,如果您正在接受用户输入并期望一个数字,并且用户输入了您不期望的内容(例如字符串),则您的程序将抛出NumberFormatException
。您可以预测这些方案并将try/catch
尝试在它们发生之前避免它们。很少见到一个人添加throws NullPointerException
或throws 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
循环。