250213-异常exception
1. 概念
异常的抛出(throw):若在方法运行中出现错误,则方法会生成代表该异常的一个对象,并把它交给运行时系统,这个过程叫做抛出。
异常的捕获(catch):运行时系统接收到该异常对象,然后找到处理这一异常的方法的过程称为捕获。
2. java中几种常见的异常处理类:
(1)算术异常(ArithmeticException):当算术运算中出现了除以零这样的运算就会出这样的异常。
(2)空指针异常(NullPointerException):没有给对象开辟内存空间却使用该对象时会出现空指针异常。
(3)文件未找到异常(FileNotFoundException):当程序试图打开一个不存在的文件进行读写时将会引发该异常。经常是由于文件名给错,或者要存储的磁盘、CD-ROM等被移走,没有放入等原因造成。
(4)数组下标越界异常(ArrayIndexOutOfBoundsException):对于一个给定的大小的数组,如果数组的索引超过上限或低于下限都造成越界。
(5)内存不足错误(OutOfMemoryException):当可用内存不足以让Java虚拟机分配-个对象时抛出该错误。
除了上面内置的处理类,用户也可以自定义异常处理类。
3. 实例
public class DealException
{public static void main(String[] args){try{int[] arr=new int[5];arr[5]=4;System.out.println("我能到这一步吗");}catch(ArrayIndexOutOfBoundsException ex) //如果try块捕捉到异常对象,则会将该对象//与catch块中异常类的实例化对象进行匹配{System.out.println("数组赋值超出索引范围!");System.out.println("异常"+ex); //打印异常对象信息ex.printStackTrace(); //查看异常对象的详细信息}finally{System.out.println("main()方法执行完毕。");}}
}
/*输出结果:
数组赋值超出索引范围!
异常java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5at DealException.main(DealException.java:7)
main()方法执行完毕。*/
4. 异常类的处理模式
首先是try块捕捉异常对象(这里的异常对象是JVM自动实例化的),然后逐一与catch方法里的异常类的实例对象进行匹配,匹配成功则由该catch方法处理异常,然后运行finally块,然后执行程序中的其他代码;若与所有的catch方法都不匹配,则运行finally块,然后交由JVM处理(输出异常信息、终止程序运行)。
注意,finally块不是必须的,可以忽略。
由3中的实例可看到,try-catch-finally是放在方法内的。
5. throws关键字
使用throw关键字的方法表明其不处理异常,而是将异常抛给调用该方法的方法,
throws语句后无需分号。实例如下:
public class ThrowsDemo
{public static void main(String[] args){try{int[] arr=new int[5];setZero(arr,9);}catch(ArrayIndexOutOfBoundsException ex) {System.out.println("数组赋值超出索引范围!");System.out.println("异常"+ex); //打印异常对象信息ex.printStackTrace(); //查看异常对象的详细信息}System.out.println("main()方法执行完毕。");}private static void setZero(int[] arr,int index)throws ArrayIndexOutOfBoundsException{arr[index]=0;}
}
/*输出结果
数组赋值超出索引范围!
异常java.lang.ArrayIndexOutOfBoundsException: Index 9 out of bounds for length 5
java.lang.ArrayIndexOutOfBoundsException: Index 9 out of bounds for length 5at ThrowDemo.setZero(ThrowDemo.java:21)at ThrowDemo.main(ThrowDemo.java:7)
main()方法执行完毕。*/
6. throw关键字
背景:用户希望try块出现的异常对象能由自己手动实例化。
throw语句的格式:throw 异常类型的实例;(注意,带分号)。执行该条语句后则会抛出一个指定异常类型的异常对象。
7. 小结
综合前述的知识,在实际应用中,try-catch-finally、throws、throw常常联合使用。