JAVA的基本理念是“结构不佳的代码不能运行” 找到程序错误的最佳时机是运行程序之前,可惜的是在编译期间并不能找出所有的错误,有些错误必定要在 运行期找出。而这就需要错误源能通过某种方式,把错误的信息传递给某一个接收者,这个接受者会正确处理这个问题,若该接收者无法处理,则他可以把错误的信息传给下一个接收者(一个更大的环境)。
异常的概念:
异常就是在程序运行期出现的错误。(如,除以0、数组下标越界)
java异常处理机制 是 java提供的用于处理程序中错误的一种 方法。
异常情形是指阻止当前方法或作用域继续执行的 问题。(注意,普通问题是指总是可以利用当前环境下能够得到的足够信息来解决的问题,而异常情形 是指在当下的环境中无法获得必要的信息来解决的问题。)
public class Test {
public static void main (String [] args) {
int arr [] = {0,1,2,3};
System.out.print(arr[5]);
}
}
可以发现输出语句中 数组的下标越界,但javac时(编译期间)没有错误,结果运行时出现异常:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
Index 5 out of bounds for length 4
at Test.main(Test.java:4)
表示为:运行期间在“main”线程中出的错,代码的第4行出现了数组下标越界的异常。
.ArrayIndexOutOfBoundsException 为错误的名字
java.lang.ArrayIndexOutOfBoundsException: 表示了这个错误在lang包的Exception类。
从这里也可以看出java 把 exception异常看为某一个类的一个对象
让我们在api文档中看一看。
设计良好的程序应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可以预见的错误。
抛出异常:在程序de运行期间如出现异常情形,可以生成一个异常类对象,该异常类对象封装了异常情形的信息,把这个信息提交给java运行时系统(接收者)的过程称为抛出(throw)异常。
java运行时系统默认的处理 如上图,直接把异常对象里面包装的信息打印到了控制台上。
而我们要做的一点就是,在抛给java运行时系统之前,我们把异常给捕捉住,并作出相应的处理。
捕获异常
java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获异常。
我们需要理解**监控区域:**的概念,是一段可能出现异常的代码,其后紧跟着解决异常的 代码。
try{…}catch{…}finally{…}
try块
如果希望方法内部出现异常或者方法内部调用的其他方法出现异常的程序继续运行的话,则需要设置一个try块,在这个try块里尝试各种可能引发异常的方法调用,用来捕捉异常。
try{
监控区域
}
当然捕捉到异常之后,就是对异常的处理。
异常处理紧跟在try块之后,用catch来表示,为异常处理程序
try {
......
}catch(Type1 id1) {
// handle exceptions of Type1
}catch(Type2 id3) {
// handle exceptions of Type2
}catch(Type3 id3) {
// handle exceptions of Type3
}......
每一个catch子句,看起来就像是仅仅接受一个特殊参数的方法。
当异常被抛出时,异常处理机制将负责搜寻这个特殊参数与异常类型相匹配的第一个处理程序(当某一个异常对象发生了,异常对象封装到了参数对象中,之后调用catch),然后进入catch子句,这个时候认为异常得到了处理。catch子句结束则处理程序的查找过程结束。
public class Test {
public static void main (String [] args) {
int arr [] = {
0,1,2,3};
try {
System.out.print(arr[6]);
}catch (ArrayIndexOutOfBoundsException id1) {
//参数id1 为我们给异常对象取的名字
System.out.println