Java学习笔记3.10.2 异常处理 - 异常捕获

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习笔记3.10.2 异常处理 - 异常捕获相关的知识,希望对你有一定的参考价值。

文章目录

零、本讲学习目标

  1. 掌握异常捕获语句格式
  2. 掌握如何捕获多个异常

一、异常捕获概念

  • 当程序发生异常时,会立即终止,无法继续向下执行。为了保证程序能够有效的执行,Java中提供了一种对异常进行处理的方式——异常捕获。

二、实现异常捕获

(一)异常捕获try…catch语句

1、语法格式

try 
    // 可能发生异常的语句
 catch(Exception类或其子类 e)
    // 对捕获的异常进行相应处理

2、案例演示

  • c03.s10.02包里创建Example01
package c03.s10.p02;

import java.util.Scanner;

/**
 * 功能:捕获单个异常
 * 作者:华卫
 * 日期:2022年11月08日
 */
public class Example01 
    /**
     * 整数除法
     *
     * @param m
     * @param n
     * @return q
     */
    public static int divide(int m, int n) 
        int q = m / n;
        return q;
    

    public static void main(String[] args) 
        int m, n, q;
        Scanner sc = new Scanner(System.in);

        System.out.print("m = ");
        m = sc.nextInt();
        System.out.print("n = ");
        n = sc.nextInt();

        q = divide(m, n);

        System.out.println(m + " ÷ " + n + " = " + q);

        System.out.println("程序到此执行完毕!");
    

  • 运行程序,查看结果

  • 如果除数n不为0,程序运行正常,输出除法的结果

  • 如果除数n为0,程序抛出异常后终止,无法输出除法的结果

  • 修改divide()方法,对可能导致异常的代码进行异常处理

public static int divide(int m, int n)                         
    try                                                        
        int q = m / n;                                          
        return q;                                               
     catch (Exception e)  // 捕获异常进行处理                         
        System.err.println("异常信息:" + e.getMessage());           
                                                               
    return Integer.MIN_VALUE; // 程序异常时返回最小整数                    
                                                               
  • 修改main()方法,对调用方法返回结果进行判断
public static void main(String[] args)                     
    int m, n, q;                                            
    Scanner sc = new Scanner(System.in);                    
                                                            
    System.out.print("m = ");                               
    m = sc.nextInt();                                       
    System.out.print("n = ");                               
    n = sc.nextInt();                                       
                                                            
    q = divide(m, n);                                       
    if (q == Integer.MIN_VALUE)                            
        System.err.println("程序发生了异常!");                     
     else                                                 
        System.out.println(m + " ÷ " + n + " = " + q);      
           

    System.out.println("程序到此执行完毕!");                                                
                                                           
  • 运行程序,查看结果

  • 虽然程序发生了异常,但是程序的最后一条语句也是执行了的。

3、简要说明

  • 在定义的整数除法运算方法divide()中对可能发生异常的代码用try...catch语句进行了捕获处理。在try代码块中发生除0异常,程序会转而执行catch()中的代码,通过调用Exception对象egetMessage()方法,即可返回异常信息:“/ by zero”。catch()代码块对异常处理完毕后,程序仍会向下执行,执行return Integer.MIN_VALUE;,而不会因为异常而终止运行。
  • 需要注意的是,在try代码块中,发生异常语句后面的代码是不会被执行的,比如发生异常的语句“int q = m / n;”后面的返回语句“return q;”就没有执行。
  • 在程序中,如果希望有些语句无论程序是否发生异常都要执行,这时就可以在try…catch语句后,加一个finally代码块。

(二)异常捕获try…catch…finally语句

1、语法格式

try 
    // 可能发生异常的语句
 catch(Exception类或其子类 e)
    // 对捕获的异常进行相应处理
 finally 
    // 无论是否发生异常,此代码块代码总会执行

2、案例演示

  • 修改Example01类里的divide()方法,添加finally代码块

  • 运行程序,查看结果

  • 除数不为零的情况 - 没有异常

  • 除数为零的情况 - 发生异常

3、简要说明

  • 由此可见,无论程序是否发生了异常,finally代码块里的语句都会被执行。正是由于这种特殊性,在程序设计时,经常会在try...catch后面使用finally代码块来完成善后工作,比如释放系统资源、关闭数据库连接、关闭线程池等。

  • 如果在try...catch中执行了System.exit(0)语句,finally中的代码就不会被执行。因为System.exit(0)语句表示退出当前的Java虚拟机,既然Java虚拟机都停止了,当然任何代码都不能再执行了。

  • 由于在catch代码块里添加了一条System.exit(0)语句,于是finally代码块里的语句就没有被执行,输出信息里就没有“无论程序是否异常,都会执行~”了。

(三)捕获多个异常

  • 如果有多个异常要处理,一般是先处理小异常,再依次处理较大的异常。

1、错误:大异常在小异常之前

  • 先捕获Exception大异常,再捕获ArrayIndexOutOfBoundsException小异常
  • 鼠标移到小异常上面,系统会提示“Exception 'java.lang.ArrayIndexOutOfBoundsException' has already been caught(该异常已被捕获)”。

2、正确:小异常在大异常之前

  • 先捕获ArrayIndexOutOfBoundsException小异常,再捕获Exception大异常
  • 查看源代码
package c03.s10.p02;

/**
 * 功能:大异常在小异常之前
 * 作者:华卫
 * 日期:2022年11月08日
 */
public class Example02 
    public static void main(String[] args) 
        int[] arr = 23, 56, 89, 73, 70;
        try 
            for (int i = 0; i <= arr.length; i++) 
                System.out.print(arr[i] + " ");
            
         catch (ArrayIndexOutOfBoundsException e) 
            System.err.println("异常信息:数组下标越界!");
         catch (Exception e) 
            System.err.println(e.getMessage());
        
    

以上是关于Java学习笔记3.10.2 异常处理 - 异常捕获的主要内容,如果未能解决你的问题,请参考以下文章

Java学习笔记3.10.5 异常处理 - 自定义异常

Java基础学习笔记十八 异常处理

尚硅谷_Java零基础教程(异常处理)-- 学习笔记

Java学习笔记3.10.3 异常处理 - 抛出异常

Java异常处理_学习笔记

java中的try-catch-finnal异常处理(学习笔记)