Lesson9 异常处理

1 异常概述

  • 3类错误

    • 编译错误
    • 逻辑错误
    • 运行时错误:在程序运行过程中如果发生了一个不可能执行的操作,就会出现运行时错误。
  • 异常:异常实际上是程序中错误导致中断了正常的指令流的一种事件

    • 异常是一个可以正确运行的程序在运行中可能发生的错误。
  • 异常特点

    • 偶然性:程序运行中,异常并不总是会发生。
    • 可预见性:异常的存在和出现是可以预见的。
    • 严重性:一旦异常发生,程序可能终止,或者运行的结果不可预知。
  • 异常处理 ( Exception Handling ):提出或者是研究一种机制,能够较好的处理程序不能正常运行的问题。

2 java异常类/异常的层次结构

java异常类

Pasted image 20241118161516.png

  • Error:由Java虚拟机生成并抛出,Java程序不做处理
  • Runtime Exception:编译时不可监测的异常,由系统检测, 用户的Java程序可不做处理,系统将它们交给缺省的异常处理程序。
  • 非Runtime Exception编译时可以监测的异常,Java编译器要求Java程序必须捕获或声明所有的非运行时异常,可以通过try-catch或throws处理。
  • throw:用户自己产生异常。
常见的异常
  1. ArithmeticException
  2. ArrayIndexOutOfBandsException
  3. ArrayStoreException
  4. IOException
  5. FileNotFoundException
  6. NullPointerException
  7. MalformedURLException
  8. NumberFormatException
  9. OutOfMemoryException
异常分类
  • 非受检异常 ( unchecked exception ) :包括 Runtime Exception 及其子类、Error 及其子类。
    • 这些异常只能在程序执行时被检测到,不能在编译时被检测到
    • 程序对这类异常可不做处理,交由系统处理。
  • 受检异常 ( checked exception ):除了非受检异常之外的异常(即其他的异常类都是可检测的类)
    • 这些异常在编译时就能被java编译器所检测到异常。
    • 必须采用 throws 语句或者 try-catch 方式处理异常

3 java异常处理机制

  • 抓抛模型
    • 抛出(throw)异常:Java程序在正常的执行过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出,且其后代码就不再执行
      • 关于异常对象的产生
        • 系统自动生成异常对象
        • 手动生成一个异常对象,并抛出(throw
    • 捕获(catch)异常:可以理解为异常处理方式。
      • try-catch-finally
      • throws
  • Java语言按照面向对象的思想来处理异常:
    • 把各种不同类型的异常情况进行分类,用Java类来表示异常情况,这种类被称为异常类。
    • 用throws语句在方法声明处声明抛出特定异常。(只抛出不处理,交给调用该方法的方法进行处理,若一直不处理,则交给系统处理
    • 用try-catch语句来捕获并处理异常。(处理
    • 用throw语句在方法中抛出具体的异常。(自定义异常

4 try-catch-finally

finally:无条件执行的语句

public class ExceptionTest2 {  
    public static void main(String[] args){  
        System.out.println("这是一个异常处理的例子\n");  
        try{  
            int i=10;  
            String[]str={"I","Like","Java"};  
            str[5]="Hel1o";  
            i/=0;  
            // str[5]="Hel1o";  
        } catch(ArithmeticException e){  
            System.out.println("异常是:"+ e.getMessage());  
        } catch(IndexOutOfBoundsException e){  
            System.out.println("异常是:"+ e.getMessage());  
        }finally {  
            System.out.println("finally 语句被执行!");  
        }  
        System.out.println("Everything is fine!!!");  
    }  
}
这是一个异常处理的例子

异常是:Index 5 out of bounds for length 3
finally 语句被执行!
Everything is fine!!!
  • try{} 中执行 returnfinally 语句仍然执行,在 return 前执行
    Pasted image 20241118165425.png
    Pasted image 20241118165435.png
  • try{} 中执行 exist(0)finally 语句不执行

try-catch-finally 语句格式

  • 一个try一个catch可以,一个try一堆catch也可以,try-catch-finally也可以,try-fianlly也可以

  • try-catch-finally 语句的语法格式

    • 一般 finally 写释放资源的部分(打开水龙头后无论水龙头能不能使最后都要关上水龙头)
    • 如果一个异常类和其子类都出现在catch子句中,应把子类放在前面,否则将永远不会到达子类。
try {
	// 接受监视的程序块,在此区域内发生的异常,由catch中指定的程序处理;
}
catch (ExceptionType1 e) {
	// 抛出ExceptionType1异常时要执行的代码
}
catch (ExceptionType2 e) {
	// 抛出ExceptionType2异常时要执行的代码
}……
[finally {
	// 无条件执行的语句
}]
  • try-finally
//try-finally
try{
	// 对文件进行处理的程序
}
finally{
	// 不论是否发生异常,都关闭文件
}
  • catch(异常名1|异常名2|异常名3 变量)
try{

}catch(异常名1 |异常名2 |异常名3… 变量){

}

方法虽简洁,但是也不是特别完美

  • 上述异常必须是同级关系;
  • 处理方式是一样的(针对同类型的问题,给出同一个处理)

try-with-resourse

  • 资源:所有实现Closeable的类,如流操作,socket操作,httpclient等
  • 打开的资源越多,finally中嵌套的将会越深,所以引入了 Try-with-resourse
  • 带资源的try语句(try-with-resource)的最简形式为:
try(Resource res = xxx){ // 可指定多个资源
	work with res
}
  • 处理规则
    • 凡是实现了AutoCloseable接口的类,在try()里声明该类实例的时候,在try结束后,close方法都会被调用
    • try结束后自动调用的close方法,这个动作会早于finally里调用的方法
    • 不管是否出现异常,try()里的实例都会被调用;
    • close方法越晚声明的对象,会越早被close掉。
例1

Pasted image 20241118170103.png

例2

Pasted image 20241118170108.png

do something
resource is closed
例3

先声明的后关闭
Pasted image 20241118170213.png

do something
do other things
other resource is closed
some resource is closed

5 Throws

用于声明异常

  • 声明异常:一个方法不处理它产生的异常,而是沿着调用层次向上传递,由调用它的方法来处理这些异常,叫声明异常。

  • Throws语句用来表明一个方法可能抛出的各种异常,并说明该方法会抛出但不捕获异常

  • 声明异常的格式

<访问权限修饰符><返回值类型><方法名>(参数列表) throws 异常列表{}
  • 当父类中的方法没有throws,则子类重写此方法时也不可以throws。若重写方法中出异常,必须采用try结构处理。

  • 重写方法不能抛出比被重写方法范围更大的异常类型,子类重写方法也可以不抛出异常。
    Pasted image 20241118170759.png

  • 若最终方法也没有处理异常,异常将交给系统处理
    Pasted image 20241118170840.png

Pasted image 20241118194629.png
Pasted image 20241118194647.png
Pasted image 20241118194715.png
Pasted image 20241118194836.png

6 throw与创建自定义异常类

  • 不是由Java系统监测到的异常,而是由用户自己定义的异常
  • 用户定义的异常必须由用户自己抛出 throw new MyException
  • 语句格式
<class><自定义异常名>extends<Exception>{}

throw

  • throw抛出异常主要用于自定义异常。
  • throw的语句格式为:<throw><异常对象>
  • 程序会在throw语句处立即终止,转向 try…catch 寻找异常处理方法。
    Pasted image 20241118171724.png
    Pasted image 20241118171736.png
    Pasted image 20241118171744.png
Built with MDFriday ❤️