首页 > 代码库 > 12-21java面向对象之异常
12-21java面向对象之异常
1.异常
异常是导致程序中断执行的一种指令流。
public class TestException1 { public static void main(String[] args) { int i = 10; //定义整型变量 int j =0 ; //定义整型变量 int temp = i/j ; System.out.println("两个数字相除的结果:" + temp); } }
程序在执行之后出现异常提示:
F:\Reliability\java\work\Exception>java TestException1 Exception in thread "main" java.lang.ArithmeticException: / by zero at TestException1.main(TestException1.java:7) |
public class TestException1 { public static void main(String[] args) { System.out.println("***********程序开始**************"); int i = 10; //定义整型变量 int j =0 ; //定义整型变量 int temp = i/j ; //此处产生了异常 System.out.println("两个数字相除的结果:" + temp); System.out.println("***********程序结束**************"); } }
执行的结果发现,开始执行了但是结束并没有执行。一旦产生异常之后,异常之后的程序不再执行而是直接结束程序,并把错误报告给用户。
F:\Reliability\java\work\Exception>java TestException1 ***********程序开始************** Exception in thread "main" java.lang.ArithmeticException: / by zero at TestException1.main(TestException1.java:8) |
计算机的两大杀手:
1.断电
2.被除数为0——>内存不足,全部占满
1.1异常的处理
要处理异常,必须使用异常处理格式:
Try——>catch——>finally
对之前的异常进行捕获
public class TestException2 { public static void main(String[] args) { System.out.println("***********程序开始**************"); int i = 10; //定义整型变量 int j =0 ; //定义整型变量 try { int temp = i/j ; System.out.println("两个数字相除的结果:" + temp); System.out.println("_____________________"); //两条语句没有执行 } catch (ArithmeticException e) //算数异常 { System.out.println("出现异常:" + e); } System.out.println("***********程序结束**************"); } }
执行结果:
对于异常,可以设置统一出口finally完成。
public class TestException3 { public static void main(String[] args) { System.out.println("***********程序开始**************"); int i = 10; //定义整型变量 int j =0 ; //定义整型变量 try { int temp = i/j ; System.out.println("两个数字相除的结果:" + temp); System.out.println("_____________________"); } catch (ArithmeticException e) //算数异常 { System.out.println("出现异常:" + e); } Finally //异常的统一出口 { System.out.println("***********程序结束**************"); } } }
以上的程序只是在代码中处理了一个异常,如果有多个异常?
通过初始化参数输入i,j的数值
public class TestException4 { public static void main(String[] args) { System.out.println("***********程序开始**************"); try { int i = Integer.parseInt(args[0]) ; //初始化参数 int j = Integer.parseInt(args[1]) ; int temp = i/j ; System.out.println("两个数字相除的结果:" + temp); System.out.println("_____________________"); } catch (ArithmeticException e) //算数异常 { System.out.println("出现异常:" + e); } finally { System.out.println("***********程序结束**************"); } } }
对于不同的输入,得到不同的结果。
对于以上的问题,进行修改catch代码
public class TestException4 { public static void main(String[] args) { System.out.println("***********程序开始**************"); try { int i = Integer.parseInt(args[0]) ; //初始化参数 int j = Integer.parseInt(args[1]) ; int temp = i/j ; System.out.println("两个数字相除的结果:" + temp); System.out.println("_____________________"); } catch (ArithmeticException e) //算数异常 { System.out.println("出现异常:" + e); } catch(ArrayIndexOutOfBoundsException e) //数组越界异常 { System.out.println("出现异常:" + e); } catch (NumberFormatException e) //数字转换格式异常 { System.out.println("出现异常:" + e); } finally { System.out.println("***********程序结束**************"); } } }
以上程序需要处理三个异常,这样一来程序异常处理十分麻烦,所以深入了解异常类的继承结构。
1.2异常类的继承结果
之前出现的三个异常:ArithmeticException
ArrayIndexOutOfBoundsException
NumberFormatException
Jav.lang->class 中的exception中异常处理有个类。
在java的异常处理中有两个最常用的类——exception 和error类
其中 exception 表示的是程序中出现的问题,try-catch进行处理
Eoor 指的是JVM中的错误,程序无法处理
注意:在输出异常信息的时候,可以直接使用System.out.println()进行输出,也可以使用Exception类中的方法public void printStackTrace(),专门打印异常信息。
1.3java异常处理机制
在整个java中,对于异常的处理是安装面向对象的方式进行的
1、一旦产生异常,首先会产生一个异常类的实例化对象
2、用try语句进行捕获
3、产生的异常对象与catch各个异常类型进行匹配
之前讲解过对象的多态性,子类的实例化可以用父类的对象进行接收,那么异常处理中,实际上也是使用这个概念,因为try产生实例化对象,都可以进行向上转型工作。
如果有某些异常不确定,最后使用exception进行捕获。此时的exception放到最后。
public class TestException5 { public static void main(String[] args) { System.out.println("***********程序开始**************"); try { int i = Integer.parseInt(args[0]) ; //初始化参数 int j = Integer.parseInt(args[1]) ; int temp = i/j ; System.out.println("两个数字相除的结果:" + temp); System.out.println("_____________________"); } catch (Exception e) { System.out.println("最粗的异常捕获" + e); } catch (ArithmeticException e) //算数异常 { //System.out.println("出现异常:" + e); e.printStackTrace(); } catch(ArrayIndexOutOfBoundsException e) { System.out.println("出现异常:" + e); } catch (NumberFormatException e) { System.out.println("出现异常:" + e); } finally { System.out.println("***********程序结束**************"); } } }错误提示
TestException5.java:18: 错误: 已捕获到异常错误ArithmeticException catch (ArithmeticException e) ^ TestException5.java:23: 错误: 已捕获到异常错误ArrayIndexOutOfBoundsException catch(ArrayIndexOutOfBoundsException e) ^ TestException5.java:27: 错误: 已捕获到异常错误NumberFormatException catch (NumberFormatException e) ^ |
程序顺序执行,先捕获到粗的,细的就不用在执行。
既然所有的Exception对象都可以向上转型,那么直接使用Exception进行捕获是不是更加方便
public class TestException6 { public static void main(String[] args) { System.out.println("***********程序开始**************"); try { int i = Integer.parseInt(args[0]) ; //初始化参数 int j = Integer.parseInt(args[1]) ; int temp = i/j ; System.out.println("两个数字相除的结果:" + temp); System.out.println("_____________________"); } catch (Exception e) { System.out.println("最粗的异常捕获" + e); } finally { System.out.println("***********程序结束**************"); } } }
当所有的异常的处理的方式是一样的可以使用以上的形式,在比较细致的开发中不建议这样使用。
既然捕获exception方便,那么直接捕获throwable是不是更好?
首先throwable是exception的父类,理论是没有问题。但是程序try中只会抛出exception的对象,但是error没有。所以不使用这种方法。
1.4总结
1.异常出现会使程序停止
2.使用try-catch-finally
3.可以同时出现多个catch 捕获粗的放在最后,否则程序编译出现问题
4.最大的类是throwable分为两个子类
12-21java面向对象之异常