Java异常是一个描述在代码段中发生的异常(也就是出错)情况的对象。当异常情况发生,一个代表该异常的对象被创建并且在导致该错误的方法中被引发(throw)。该方法可以选择自己处理异常或传递该异常。两种情况下,该异常被捕获(caught)并处理。异 常可能是由Java运行时系统产生,或者是由你的手工代码产生。被Java引发的异常与违反语 言规范或超出Java执行环境限制的基本错误有关。手工编码产生的异常基本上用于报告方 法调用程序的出错状况。 Java异常处理通过5个关键字控制:try、catch、throw、throws和 finally。下面讲述它 们如何工作的。程序声明了你想要的异常监控包含在一个try块中。如果在try块中发生异常,它被抛出。你的代码可以捕捉这个异常(用catch)并且用某种合理的方法处理该异常。系 统产生的异常被Java运行时系统自动引发。手动引发一个异常,用关键字throw。任何被引发方法的异常都必须通过throws子句定义。任何在方法返回前绝对被执行的代码被放置在finally块中。
异常处理块的常用形式:
try { // block of code to monitor for errors } catch(ExceptionType1 exOb) { // exception handler for ExceptionType1 } catch (ExceptionType2 exOb) { // exception handler for ExceptionType2 } // ... finally { // block of code to be executed before try block ends }
finally块中写入必要执行的代码,ExceptionType 是发生异常的类型。
异常类型
1.所有异常类型都是内置类Throwable的子类,Throwable在异常类层次结构的顶层。
2.Throwable下面的是两个把异常分成两个不同分支的子类。一个分支是Exception,另一个是Error
3.Exception用于用户程序可能捕捉的异常情况。在Exception分支中有一个重要子类RuntimeException。该类型的异常自动为你所编写的程序定义并且包括被零除和非法数组索引这样的错误
4.Error定义了在通常环境下不希望被程序捕获的异常。 Error类型的异常用于Java运行时系统来显示与运行时系统本身有关的错误。堆栈溢出是这种错误的一例,通常是灾难性的致命错误,不是程序可以控制的。
try-catch:
为防止和处理一个运行时错误,只需要把你所要监控的代码放进一个try块就可以了。 紧跟着try块的,包括一个说明你希望捕获的错误类型的catch子句。
class Exc2 { public static void main(String args[]) { int d, a; try { // monitor a block of code. d = 0; a = 42 / d; System.out.println("This will not be printed."); } catch (ArithmeticException e) { // catch divide-by-zero error System.out.println("Division by zero."); } System.out.println("After catch statement."); } }
输出:
Division by zero.
After catch statement.
一旦异常被引发,程序控制由try块转到catch块。执行永远不会从catch块“返回”到try块。
构造catch子句的目的是解决异常情况并且像错误没有发生一样继续运行。
多重catch语句:
可以定义两个或更多 的catch子句,每个子句捕获一种类型的异常。当异常被引发时,每一个catch子句被依次检 查,第一个匹配异常类型的子句执行。当一个catch语句执行以后,其他的子句被旁路,执 行从try/catch块以后的代码开始继续。
// Demonstrate multiple catch statements. class MultiCatch { public static void main(String args[]) { try { int a = args.length; System.out.println("a = " + a); int b = 42 / a; int c[] = { 1 }; c[42] = 99; } catch(ArithmeticException e) { System.out.println("Divide by 0: " + e); } catch(ArrayIndexOutOfBoundsException e) { System.out.println("Array index oob: " + e); } System.out.println("After try/catch blocks."); } }