在java中万物都是类,包括错误本身也会被包装成一个对象扔出去。
常见异常
1,ArithmeticException:除数为0;
解决方法:
Scanner s = new Scanner(System.in);
int b = s.nextInt();
if(b != 0){
int a = 10 / b;
System.out.print(a);
}else{
System.out.print("除数不能为0");
}
2,NullPointerException:当程序访问一个空对象的成员变量或方法,访问一个空数组的成员时会发生空指针异常。
解决方法:
People p = new People();
if(p!=null){
System.out.print(p.age);
}
3,ClassCastException:类型转换错误。
解决方法:
Object obj = new Object() ;
if(obj instanceof People){
People p = (People)obj;
}else {
System.out.print("类型不符合");
}
4,ArrayIndexOutOfBoundsException:访问的元素超过数组的长度。
解决方法:
int[] a = {1,2,3};
int i = 4;
if(i < a.length-1){
System.out.println(a[i]);
}else {
System.out.println("超出数组范围");
}
5,NumberFormatException:一般是字符串转化为数字时出错。
解决方法:前提,字符串里面只有数字。
String str = "123";
Double d = Double.valueOf(str);
double d1 = Double.parseDouble(str);
Integer i = new Integer(str);
int i1 = Integer.parseInt(str);
其中d,d1,i,i1每一种都可以解决,实际应用中选择一种适合的方法即可。
异常的执行顺序
在异常中先执行try/catch,然后执行finally,最后执行return。
catch:如果异常类之间有继承关系,在顺序安排上注意,越是顶层的类,越放在下面。或者,直接把多余的catch去掉。
finally:有些语句,不管是否发生异常,都必须执行,那么就可以把这样的语句放到finally语句块中。
注意:finally里面一般不要加return。
异常的处理形式
1,try/catch
2,throws:声明一个或多个异常,谁调用它谁处理。(抛出异常)
3,throw:手动抛出。(异常也是对象,也可以new。)
throw new NullPointerException("自己抛出去");
方法重写中声明异常原则:
子类声明的异常范围不能超过父类声明的范围。
1,父类没有声明异常,子类也不能声明。
2,不可抛出原有方法抛出异常类的父类或上层类。
使用异常机制建议:
1,要避免使用异常处理代替错误处理,这样会降低程序的清晰性,并且效率低。
2,处理异常不可以都代替简单测试——只在异常情况下使用异常机制。
3,不要进行小颗粒的异常处理——应该将整个任务包装在一个try语句块中。
4,异常往往在高层处理。(底层抛出,高层处理)。(高层:程序越往后执行,层次越高。)
5,main方法中一般不要抛异常。(最高层)