Java基础00-异常25
1. 异常
1.1 异常概述
1.2 JVM的默认处理方案
有一行代码报错,下面的代码就不会执行。
1.3 异常处理
如果程序出现了异常,需要我们自己来处理,
因为在实际的开发中,不能因为一处的报错,影响了接下来程序的运行。
1.4 异常处理之try … catch …
代码示例:
运行结果:
这次通过自己定义的异常处理,不会再像默认的那样直接停止程序了,而是会输出一段异常处理代码,再执行下面的代码。
1.4.1 finally关键字
finally 关键字用来创建在 try 代码块后面执行的代码块。
无论是否发生异常,finally 代码块中的代码总会被执行。
在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
finally 代码块出现在 catch 代码块最后,语法如下:
try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }finally{ // 程序代码 }
1.5 Throwable的成员对象
Throwable类是所有异常和错误类的祖宗类,所以利用多态,可以使用Throwable的子类,可以使用Throwable的成员方法。
代码示例:
getMessage()方法
运行结果:
输出了程序错误的原因
toString()方法
运行结果:
输出了程序错误的位置和原因
printStackTrace()
运行结果:
输出了错误原因和异常位置,还有异常信息
printStackTrace()输出的错误信息是最全的,一般使用的是printStackTrace()方法来提示错误信息。
1.6 编译时异常和运行时异常的区别
编译时异常:在写代码时,编译器可以提示错误信息,不修改则不可以运行程序。
运行时异常:在写代码时,编译器没有提示错误信息,也可以运行,但是运行后会提示异常信息。
1.7 异常处理之throws
代码示例:
运行时异常使用throws
运行结果:
结果是并没有输出”结束”,可以程序已经停止,throws的作用只不过是抛出异常信息,并没有实际的解决问题
编译时异常没使用throws时:
编译时异常使用throws:
编译时异常使用throws时代码时不报错了,但是调用的时候还是会报错,在调用的时候还是要我们自己处理异常。
可见编译时异常使用throws时是,谁调用谁处理。
运行结果:
总结:不管是编译时异常还是运行时异常,都可以通过在方法后面加上throws,抛出异常。
但是这种抛出,它并没有做实际的处理,真正的处理还是要通过 try … catch … 进行处理。
1.8 自定义异常
继承Exception
代码示例:
写一个自定义异常类:
继承Exception(异常类),写一个无参构造和一个有参构造。
创建一个使用异常的类:
因为自定义类继承的是Exception类,所以它是编译时异常,所以要用throws接收异常对象,把异常信息抛出去,让调用者去处理。
而throw的作用就是抛出异常对象,让throws接收,给出我们自己想要给出的提示信息。
测试类:
运行结果:
98,正常
120,超处了自定义异常类中的规定数字,报出了异常,但是没有异常信息,
因为我们使用的是自定义异常类是无参构造的方法,这次使用有参构造方法,向下看。
修改异常使用类:
运行结果:
98,正常
120,异常,但是这次给出了报错信息,因为使用的是有参的构造方法。
1.9 throws和throw的区别
1 public void method() throws Exception1,Exception2,...,ExceptionN{ 2 ... 3 }
1 //方法内部自己抛出的异常自己处理 2 public void test(){ 3 Scanner sc = new Scanner(System.in); 4 int age = sc.nextInt(); 5 if(age<18 || age>80){ 6 try { 7 throw new Exception("test"); 8 } catch (Exception e) { 9 e.printStackTrace(); 10 } 11 } 12 }
1 //谁调用test谁处理,也可在方法调用处继续向上抛由上层来处理 2 public void test2() throws Exception { 3 Scanner sc = new Scanner(System.in); 4 int age = sc.nextInt(); 5 if(age<18 || age>80){ 6 throw new Exception("test"); 7 } 8 }