1.认识异常
使程序的正常流程和错误分开处理,促使程序正确的运行,避免崩溃。
1.1了解Java异常
异常的来源:一是程序运行时发生了异常,由下图生成异常实例并抛出,二是开发者来源throw关键字完成抛出,主要是用于提供异常信息
处理动作:抛出异常和捕获异常(调用适合的处理方法)
1.2异常类的继承关系
父类都是Throwable,其子类才可以通过JVM或特定语句抛出异常,主要包括以Exception和Error两种
2.异常的处理---捕获处理异常
2.1异常处理过程
2.2 try…catch…finally语句
(try…catch结构、try…finally结构、try…catch…finally结构)
2.3 Java7的改进
(允许语句同时捕捉多个可能异常类)
3.常见应用
3.1获取异常信息
方法名 |
说明 |
String getMessage() |
返回Throwable的详细消息字符串 |
printStackTrace() |
方法将Throwable对象的堆栈跟踪输出至错误输出流 |
String toString() |
返回Throwable的简短描述(描述与定位) |
3.2异常的作用和使用原则
获得异常信息与恢复出错的程序使之能够正常运行
3.3常见的异常类
异常类 |
说明 |
ArithmeticException |
算术异常 |
NullPointerException |
空指针异常。调用了未初始化的或不存在的对象 |
ArrayIndexOutOfBoundsException |
数组下表越界异常。使用的下标超过最大索引值 |
ClassNotFoundException |
指定的类不存在。引用的包名或类名错误 |
ClassCastException |
类转化异常。强制转换数据类型不兼容 |
NumberFormatException |
字符串转换数字异常。字符串转换数字错误 |
FileNotFoundException |
文件未找到异常。打开文件失败 |
EOFException |
输入过程意外到达文件末尾或流尾 |
IOException |
I/O操作意外中断或失败 |
SQLException |
数据库访问错误 |
//try...catch...finally public class NException { static int[]getValue(){ int[] arry = new int[4]; for (int i = 0; i < arry.length; i++) { arry[i] = (int)(Math.random() * 10); } return arry; } public static void main(String[] args) { int nnum = 9, nresult = 0; int[] arry = NException.getValue(); Exception ex = null; try { for (int i = 0; i < arry.length; i++) { nresult = nnum/arry[i]; System.out.println("nResult的值是:" + nresult + "---数组元素的值是:" + arry[i]); } } catch (ArithmeticException e) { ex = e; e.printStackTrace(); //输出堆栈错误信息 // TODO: handle exception } finally { if(ex != null) { System.out.println("进入finally:"); int[] arry1 = NException.getValue(); try { for (int i = 0; i < arry1.length; i++) { nresult = nnum/arry[i]; System.out.println("出现异常,重新计算nResult的值是:" + nresult + "---数组元素的值是:" + arry1[i]); } } catch (ArithmeticException e) { // TODO: handle exception e.printStackTrace(); } } } } }
4.异常的抛出
4.1方法头中的throws关键字
方法中可能发生的异常
[(访问修饰符) (修饰符)] 返回值类型 方法名([参数列表])[throws 异常类1, 异常类2, 异常类n]{ //具体 }
4.2方法体中的throw语句
方法中有意识的抛出异常,2种对应处理方法
throw 异常实例名;
5.自定义异常
5.1自定义异常的方法
[修饰符] class 自定义异常类名 extends Exception{...}
//自定义异常 public class MyNumExcption extends Exception{ public MyNumExcption(String msg) { super(msg); } } import java.util.Scanner; //计算圆面积 public class CircularArea { static double getArea(double r) throws MyNumExcption{ if (r < 0) { //抛出异常 throw new MyNumExcption("圆半径不应当小于0!");//异常 } double area = 3.14 * r * r; return area; } public static void main(String[] args) { double r = 0; double area = -1; Scanner input = new Scanner(System.in); //获取半径输入 System.out.println("输入半径:"); r = Double.parseDouble(input.next()); try { area = getArea(r); } catch (MyNumExcption e) { //捕获异常 // TODO: handle exception System.out.println(e); } System.out.println("圆面积是:" + area); } }