其实差别还是蛮大的。
取第一个并在打印后添加一行:
public class ExceptionExample {
private static String str;
public static void main(String[] args) {
System.out.println(str.length());
System.out.println("Does this execute?");
}
}
您会看到它Does this execute?
没有被打印出来,因为异常会中断代码流并在没有被捕获时停止它。
另一方面:
public class ExceptionExample {
private static String str;
public static void main(String[] args) {
try {
System.out.println(str.length());
} catch(NullPointerException npe) {
npe.printStackTrace();
}
System.out.println("Does this execute?");
}
}
将打印堆栈跟踪和 Does this execute?
. 那是因为捕获异常就像是说,“我们将在这里处理并继续执行。”
另一种说法,catch
块是错误恢复应该发生的地方,所以如果发生错误但我们可以从中恢复,我们将恢复代码放在那里。
编辑:
这是一些错误恢复的示例。假设我们有一个不存在的文件C:\nonexistentfile.txt
。我们想尝试打开它,如果找不到,向用户显示一条消息,说它丢失了。这可以通过在FileNotFoundException
此处捕获生成的内容来完成:
// Here, we declare "throws IOException" to say someone else needs to handle it
// In this particular case, IOException will only be thrown if an error occurs while reading the file
public static void printFileToConsole() throws IOException {
File nonExistent = new File("C:/nonexistentfile.txt");
Scanner scanner = null;
try {
Scanner scanner = new Scanner(nonExistent);
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException ex) {
// The file wasn't found, show the user a message
// Note use of "err" instead of "out", this is the error output
System.err.println("File not found: " + nonExistent);
// Here, we could recover by creating the file, for example
} finally {
if (scanner != null) {
scanner.close();
}
}
}
所以这里有几点需要注意:
- 我们捕获
FileNotFoundException
并使用自定义错误消息,而不是打印堆栈跟踪。与打印堆栈跟踪相比,我们的错误消息更清晰、更人性化。在 GUI 应用程序中,用户甚至可能看不到控制台,因此这可能是向用户显示错误对话框的代码。仅仅因为该文件不存在并不意味着我们必须停止执行我们的代码。
- 我们
throws IOException
在方法签名中声明,而不是在FileNotFoundException
. 在这种特殊情况下,IOException
如果我们无法读取文件,即使它存在,也会在此处抛出。对于这种方法,我们说处理我们在读取文件时遇到的错误不是我们的责任。这是一个如何声明不可恢复错误的示例(这里的不可恢复,我的意思是不可恢复,它可能在更远的地方可以恢复,例如在调用的方法中printFileToConsole
)。
- 我不小心在
finally
这里介绍了该块,所以我将解释它的作用。它保证如果Scanner
在我们读取文件时打开并发生错误,Scanner
则将关闭。这很重要,原因有很多,最值得注意的是,如果您不关闭它,Java 仍然会锁定该文件,因此您无法在不退出应用程序的情况下再次打开该文件。