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

本文详细介绍Java中的异常处理机制,包括try...catch语句的基本用法、try...catch...finally语句的应用场景及如何正确捕获多个异常。通过具体案例演示异常处理流程,帮助读者深入理解并掌握异常处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

零、本讲学习目标

  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());
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酒城译痴无心剑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值