异常

概述

  1. 程序在进行过程中发生的错误,叫做异常

  2. 作用:增强程序的健壮性

  3. 异常在java中以类的形式存在,每一个异常类都能创建对象

  4. 所有的错误(error)和异常(exception)都是可以抛出的

  5. 所有的错误(error)只要执行,JVM退出(不能处理)

概述二

  1. 编译时异常和运行时异常都是发生在运行阶段,在编译阶段异常是不会发生

  2. 所有异常都是在执行时发生的:

  3. 因为异常只有在执行时才能new对象

  4. 异常的发生就是new异常对象

  5. 编译时异常为什么而得名?

  6. 因为编译时异常必须在编译阶段预先处理,如果不处理,报错

  7. 运行时异常又称 非受控异常 未受检异常 (UnCheckedException)

  8. 编译时异常又称 受检异常 受控异常 (CheckedExeption)

对异常的处理

java中有两种方式处理异常

  1. 在方法声明的位置上使用throws 关键字 (抛给上一级)
  • 在java中如果一直上抛最后会抛给JVM 最后终止程序的执行
  • 一般不建议在main方法上使用throws关键字,建议使用 try..catch
  1. 使用try..catch 进行异常的捕捉

语法:

  1. try{
  2. // try 尝试 java代码
  3. }
  4. catch(异常 变量名){
  5. //捕捉异常后的分支
  6. }

编译时异常必须处理 要么上抛 要么捕捉

注意:
  1. 只要异常没有捕捉,采用上报的方式,此方法的后续代码不会执行
  2. 另外需注意,try语句块中某一行出现异常,该行后面的代码不会执行catch 捕捉到后,后续代码执行

自定义异常

  • 所有异常都有共同的特点

  • 有参构造

  • 无参构造

  • 自定义异常的编写

提供两个构造方法

  • 无参
  • 有参(string s)
  1. class MyException extends Exception {
  2. public MyException(){
  3. }
  4. public MyException(String s){
  5. super (s);
  6. }
  7. }

抛异常

throw 关键字

throw new MyException(“这是一个自定义异常”);

深入 try catch

  • catch 后面的小括号可以是具体的异常类型,也可以是该异常类型的父类型

  • catch可以写多个,建议catch一个一个精准处理

  • catch写多个的时候,从上到下必须是从小到大

什么时候选择捕捉/上报

  • 如果希望调用者来处理异常,使用上报
  • 其他情况使用捕捉

异常对象的两个重要方法

获取异常简单的描述信息 这个信息就是构造器里的String参数

  1. Exception exception = new Exception("你的程序报错")
  2. String s = exception.getMessage();
  3. System.out.println(s); 这里会输出 你的 程序报错

打印异常追踪的堆栈信息

  1. exception.printStackTrace();
  2. java.lang.Exception: asdfat While03.main(While03.java:6)

异常信息如何看

从上往下,一行一行(sun公司写的代码不用看)

finally

和try..catch 一起使用
  • 在finally子句中的代码时最后执行的,并且一定会执行
  • 即使try出了异常,也会执行

try和fianlly可以联合使用(没有catch)
  1. try{
  2. System.out.println("aaa");
  3. return;
  4. } finally{
  5. System.out.println("bbb");
  6. }
  7. //输出结果 aaa bbb

但是如果try中有System.exit(0); //退出jvm

finally不执行 只有这一条代码能治他

总结

异常 - 图1