Java学习笔记3.10.2 异常处理 - 异常捕获
Posted howard2005
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习笔记3.10.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
对象e
的getMessage()
方法,即可返回异常信息:“/ 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 异常处理 - 异常捕获的主要内容,如果未能解决你的问题,请参考以下文章