📅  最后修改于: 2023-12-03 15:41:58.296000             🧑  作者: Mango
在开发过程中,避免不了会出现各种异常情况,这些异常在未处理的情况下,程序将会停止运行或者出现异常崩溃。因此,通用异常处理程序成为了很重要的一部分,在应对异常情况时,可以有效地减少用户的体验和程序界面的崩溃。
异常按照功能分为三类:
NullPointerException
、IndexOutOfBoundsException
等。可以使用 catch Exception
来处理。OutOfMemoryError
、StackOverflowError
。一般不建议手动处理这种类型的异常。我们需要针对这三类异常写出不同的处理方法。
在方法中使用 throws
关键字可以将异常抛给上层调用者进行处理,目的是让调用者更明确的知道该方法可能会发生什么异常情况,并进行相应的处理。如下:
public void read(String file) throws FileNotFoundException {
FileInputStream fis = new FileInputStream(file);
// ...
}
上述代码中,在 read
方法的调用栈中,会抛出 FileNotFoundException
异常,因此必须对其进行捕捉处理。在这种情况下,我们可以在调用方法处使用 try catch
块来捕捉该异常,进行相应的处理,如下:
try {
read("config.ini");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
非受检异常通常是由程序逻辑上的问题引起的,如数组越界、空指针异常等。为了捕捉这种异常,我们需要使用 try catch
块将可能出现异常的代码封装起来。如下:
try {
System.out.println(array[10]);
} catch (ArithmeticException e) {
e.printStackTrace();
}
上述代码中,如果 array
数组越界,则会引发 ArrayIndexOutOfBoundsException
异常。我们可以捕捉并打印异常信息。但是,由于非受检异常往往会导致程序中止运行,因此在捕捉这种异常时,需要谨慎,并且尽可能收集异常信息以便更好的填坑。
错误是无法处理的异常,建议不要进行处理,因为错误已经超出了程序的处理能力,可能会导致程序崩溃。因此,在不得已的情况下,才考虑对错误进行处理。通常情况下,我们尽可能去避免错误的发生。
如果每个异常都写一个 try catch,代码看起来会变得混乱并且很难维护,因此通常采用统一异常处理的方式。代码如下:
public static void main(String[] args) {
try {
// 执行代码块
} catch (Exception e) {
// 捕捉所有异常
e.printStackTrace();
} finally {
// 在异常发生后(或者没有发生),都会执行的代码块
}
}
上述代码中,try
块是需要被处理的代码块,捕捉所有异常的 catch
块和 finally
块是在发生异常后需要执行的代码块。这样的统一处理方式也更容易让程序员清晰地知道程序的异常情况。
在编写程序时,异常处理是至关重要的一部分。需要对受检异常、非受检异常、错误进行分类处理,并且使用统一的异常处理方式来提高代码的可读性和可维护性。针对不同情况采取不同的处理方式,可以在保障程序正常运行的同时,更好地保护用户体验和程序界面的顺畅。