在Java中如果写出下列的程序:
int[] a=new int[10];
a[10]=10;
这个程序在编译的时候并不会报错,但是在运行是会产生错误,编辑器会报出:java.lang.ArrayIndexOutOfBoundsException的错误,这个就是程序不正常的情况,这个在查看代码时我们很轻易地就知道他是因为索引越界而产生的,这个就是我们所说的异常情况之一。
JVM对异常默认的处理方案:
1.把异常的名称、异常的原因、异常出现的位置 输出在控制台上。
2.终止程序。
处理异常的常用方法有:try…catch,throws。
try{
//可能产生异常的代码
}catch(Type1 id1){
//处理Typde1异常的代码
}catch(Typde2 id2){
//处理Typde2异常的代码
}catch(Typde3 id3){
//处理Typde3异常的代码
}
因为在代码中可能 会产生一种或多种代码,所以要把所有可能的异常都要用一个catch捕捉,消除因为异常的产生而引起的程序不能运行的影响。
这个时候就可以把上面的数组放入try…catch中,如下
try {
int[] a=new int[10];
a[10]=10;
System.out.println(a);
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println(e.getMessage());
System.out.println(e);
e.printStackTrace();
}
这样他就可以捕捉因为索引越界而产生的异常。进而消除他的影响。
在异常的捕捉机制中:
异常产生后会一层一层的跳出函数去寻找try…catch去消除一场产生的影响。例如下面的代码:
package yichang;
public class Yichang1 {
public static void f() {
int[] a=new int[10];
a[10]=10;
System.out.println("f");
}
public static void g() {
f();
}
public static void h() {
int i=10;
if(i<100) {
g();
}
}
public static void j() {
try {
h();
}catch(NullPointerException e) {//此时产生的异常和这个catch不匹配就会继续跳出结构,寻找相应的try...catch
System.out.println("j()");
}
}
public static void main(String[] args) {
try {
j();
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println(e.getMessage());
System.out.println(e);
e.printStackTrace();
}
}
}
产生的结果就是:
Index 10 out of bounds for length 10//指出异常的原因
java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 10
java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 10
at yichang.Yichang1.f(Yichang1.java:6)
at yichang.Yichang1.g(Yichang1.java:10)
at yichang.Yichang1.h(Yichang1.java:15)
at yichang.Yichang1.j(Yichang1.java:20)
at yichang.Yichang1.main(Yichang1.java:27)//从下往上看就相当于一层一层函数的嵌套