本文将简要介绍Java中的一些异常和错误

简介:Java中的异常或者错误都有一个共同的祖先Throwable(可抛出),它有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。Error指的是代码运行时JVM出现的故障,不属于程序员的责任范畴,故在这里只做介绍。Exception指的是应用程序中可由程序员解决的问题。主要可分为两种:

运行时异常(RuntimeException):指可以在编写代码时避免的异常,编译器懒得帮你指出

已检查异常(CheckedException):指外部环境因素可能导致的异常,比如调取外部文件时文件根本不存在。编译器大部分情况下会帮你指出,让你把代码写的更严谨更科学(当然编译器是人写的,他也有看不出来的时候),省的在涉及外部因素这一步时出故障,导致程序直接挂掉而产生损失。使用一些方法让程序运行出错时立马转到挽救的语句上去,从而减少损失。(直接就挂在那了有可能前面做的事情得到的数据会丢失)

下面我们分别来讨论这两种异常

RuntimeException
分类
算数异常(ArithmeticException)
数学运算上出了问题,比如分母为0
空指针异常(NullPointerException)
对象为空你却调用了他的属性和方法
强制转型错误(ClassCastException)
部分类型之间无法强转导致发生错误
通常是继承于同一父类的两个子类实例化出的对象,引用类型模糊。
数组越界异常(ArrayIndexOutOfBoundsException)
超出了数组的容纳范围而出错,如本有5个元素你想要输入或者输出六个就会越界
数字格式化异常(NumberFormatException)
包装类中,将字符串转为数字时字符串中有非数字成分
测试
1 packagecn.hbc.exception;2
3 public classTest01 {4 /**
5 * 介绍基本异常类型并测试6 *@paramargs7 */
8
9 public static voidmain(String[] args) {10 //TODO Auto-generated method stub11 //数学异常
12 int a=0;13 if(a!=0)14 System.out.println(3/a);15 //空指针异常
16 String str=null;17 if(str!=null) {18 System.out.println(str.length());19 }20 //强制转型异常
21 Cat cat;22 Animals dog=newDog();23 if(dog instanceofCat)24 cat=(Cat)dog;25 //数组越界异常
26 int[] in=new int[5];27 for(int i=0;i<5;i++){28 in[i]=1;29 }30 if(in.length>5)31 System.out.println(in[5]);32 //数字格式化异常
33 String st="2342adc";34 System.out.println(Integer.parseInt(st));35 }36
37 }38 classAnimals{39
40 }41 class Cat extendsAnimals{42
43 }44 class Dog extendsAnimals{45
46 }
CheckedException
处理方法
try catch法
格式:
try{可能出现异常的语句}
catch(特定类型的异常对象,可以自定义异常类型){
写出处理方法,一般是直接打印出异常,或者关闭一些出错的程序,对可能产生的损失加以弥补
}
finally{写出不管怎样都会执行的代码}

运行流程

在try中出现异常,停止执行try中的语句,包装成一个异常对象传到对应的catch中,执行catch中的语句,最后统一执行finally中的语句

直接抛出法

使用throws声明异常并抛出

谁调用谁处理,比如上面try catch的异常类型查源码看类型,就是找到抛出的异常的类型,然后解决别人留下来的异常

最终在main方法中抛出会丢给虚拟机,虚拟机会直接打印出异常日志

注意

catch捕获异常时注意子类异常类型在前父类异常类型在后

处理异常不可以代替简单测试---只在异常情况下使用异常机制

不要进行小粒度的异常处理---应该将整个任务包装在一个Try语句块中

异常往往在调用者处处理,暂时先了解