这个标题简单地介绍了10个Java中被问频率最高的10个异常
2.1 Checked vs Unchecked
简单来说,checked exceptions必须明确地捕获方法和声明中抛出的clause,Unchecked exceptions应该是那些被引起的不能解决的问题,比如除以0、空指针、etc。Checked cxceptions非常重要,因为你期望其他的开发者能够用你的API就能够知道怎么去解决这个异常。
例如,IOException就是一个通常被使用的checked exception,RuntimeException就是一个unchecked exception。你可以在阅读这些约束之前,先核对Java异常层次图。
关于checked和unchecked异常,可以看这篇文章
2.2 异常管理最好的实践
如果一个异常可能可以被处理,那么就应该捕获,否则,它就应该被抛出来
2.3 为什么一个被定义在try中的变量,不可以在catch或finally中使用
在下面的代码中,string被定义在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);
}
原因就是你不知道什么时候才会抛出异常,可能会在你定义变量之前就抛出了异常,所以不能在cath中使用try中定义的变量
2.4 为什么Double.parseDouble(null)和Integer.parseInt(null)会抛出不同的异常
它们当然会抛出不同的异常,这是JDK的问题,他们被不同的coder编写,所以,可能没有过多地去思考
Integer.parseInt(null);
// throws java.lang.NumberFormatException: null
Double.parseDouble(null);
// throws java.lang.NullPointerException
2.5 通常在Java中如何使用RuntimeException
这里有一些常见的运行时异常:IllegalArgumentException、ArrayIndexOutOfBoundsException
他们可以在一定条件的状态下被使用
if (obj == null) {
throw new IllegalArgumentException("obj can not be null");
2.6 我们在同一个catch代码块中捕获多个异常吗
当然可以,只要这些异常的类都能够赘述到同一个父类,他们可以直接使用父类
或者,你可以这样
try{....}
catch(IndexOutOfBoundsException|NumberFormatException|ArithmeticException ie){....}
2.7 在java中能不能在构造方法中抛出异常
当然可以,构造方法只是一个特殊的方法而已,和普通方法没有太大的不同
2.8 在final的子句中抛出异常
下面的代码是符合规范的
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的部分单独提取出来作为一个新的方法,然后在方法中还行最后的代码
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();
}
}
2.9 在finally模块中,能否使用return
当然可以
2.10为什么开发者默默地处理exception
开发中有很多的代码和下面的代码片段一样,如果处理异常是如此地重要,那么开发者为什么还要这么做???
try {
...
} catch(Exception e) {
e.printStackTrace();
}
忽略掉异常很容易,频繁地出现这样的代码,并不意味着这是正确的处理异常的代码!