本文介绍了有关 Java 异常的 10 个最常见问题。
1. 可验证与不可验证
简而言之,检查的异常必须在方法体中显式捕获或在方法的 throws 部分中声明。未检查异常是由于无法解决的问题引起的,例如除以0、空指针等。检查异常尤其重要,因为您希望使用您的 API 的其他开发人员知道如何处理异常。例如,IOException是常用的检查异常,而RuntimeException是非检查异常。在进一步阅读之前,请查看
Java 中的分层异常图。
2. 处理异常的最佳方式
如果异常能够被正确处理,则必须捕获,否则必须转发。
3.为什么try中定义的变量不能在catch或finally中使用?
在下面的代码中,try 块中声明的行不能在 catch 块中使用。该代码将无法编译。
try {
File file = new File("path");
FileInputStream fis = new FileInputStream(file);
String s = "inside";
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println(s);
}
原因是不知道 try 块中的何处可能引发异常。有可能在声明对象之前抛出异常。对于这个例子来说也是如此。
4. 为什么 Double.parseDouble(null) 和 Integer.parseInt(null) 抛出不同的异常?
没错,他们确实提出了不同的例外情况。这是一个 JDK 问题。它们只是由不同的人设计的,您不必太担心。
Integer.parseInt(null);
Double.parseDouble(null);
5. Java中的基本运行时异常
这里有几个:
IllegalArgumentException
ArrayIndexOutOfBoundsException
当条件不满足时,它们可以在 if 语句中使用,如下所示:
if (obj == null) {
throw new IllegalArgumentException("obj не может быть равно null");
6. 是否可以在一个catch块中捕获多个异常?
答案是肯定的。只要这些异常的类可以沿着类继承层次结构追溯到同一个超类,就只能使用该超类。
7. 构造函数可以抛出异常吗?
答案是肯定的。构造函数只是一种特殊的方法。
这是一个代码示例。
8. 在最后一个块中抛出异常
原则上,你可以完全合法地这样做:
public static void main(String[] args) {
File file1 = new File("path1");
File file2 = new File("path2");
try {
FileInputStream fis = new FileInputStream(file1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
FileInputStream fis = new FileInputStream(file2);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
但为了保持代码的可读性,您需要将嵌套块声明
try-catch
为新方法,并将对此方法的调用插入到该块中
finally
。
public static void main(String[] args) {
File file1 = new File("path1");
File file2 = new File("path2");
try {
FileInputStream fis = new FileInputStream(file1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
methodThrowException();
}
}
9. 是否可以在finally 块中使用return?
是的你可以。
10、为什么开发者要悄悄处理异常?
例如,这样的代码片段经常出现。如果正确的异常处理如此重要,为什么开发人员继续这样编写呢?
try {
...
} catch(Exception e) {
e.printStackTrace();
}
这是最容易被忽视的。但即使经常这样做,也不意味着它是正确的。链接:
- Java 中的未检查异常
- Java中分层异常树的根
- 关于stackoverflow上的异常问题
来源文章
GO TO FULL VERSION