目录
一、程序中的异常
丰收时节,星沐生态农场将采摘的水果平均分给每家果商,编程实现计算每家果商可以分到的蔬果重量
/** * ClaName:Test * Description:TODO * date:2022/4/4 9:02 * * @author Reincarnation * @version 1.0 * @since JDK 1.8 */ import java.util.Scanner; /** * 计算果商供应量 */ public class Test { public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.print("请输入果实采摘量(公斤):"); int weight=input.nextInt(); System.out.print("请输入果商数(家):"); int num=input.nextInt(); System.out.println("每家果商供应"+weight/num+"公斤水果。"); System.out.println("欢迎再来,预祝生意兴隆!"); } }
接受的果商数值直接影响代码的运行结果
- 正整数:程序正常运行
- 零:程序出现异常
非数字:程序出现异常
因为疏漏造成程序运行出现异常,应该怎么解决?是否可以让程序自动判断异常和处理异常呢?
代码改造如下,尝试通过if-else语句解决
/** * ClaName:Test2 * Description:TODO * date:2022/4/4 9:13 * * @author Reincarnation * @version 1.0 * @since JDK 1.8 */ import java.util.Scanner; /** * 计算果商供应量 */ public class Test2 { public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.print("请输入果实采摘量(公斤):"); int weight=0; if (input.hasNext()){ weight=input.nextInt(); }else { System.out.println("果实采摘量必须是整数!"); System.exit(1); } System.out.print("请输入果商数(家):"); int num=0; if (input.hasNext()){ num=input.nextInt(); System.out.println("果商数必须大于零!"); System.exit(1); }else { System.out.println("果商数必须是整数!"); System.exit(1); } System.out.println("每家果商供应"+weight/num+"公斤水果。"); System.out.println("欢迎再来,预祝生意兴隆!"); } }
使用if else的缺陷
1. 无法穷举所有的异常情况
2. 影响程序可读性,维护难度高解决方案:使用异常处理机制
二、什么是异常
异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
三、程序中的异常处理
Java编程语言使用异常处理机制为程序提供了错误处理的能力
1. Java中,所有的异常都定义为类
2. 除了内置的异常类之外,Java也可以自定义异常类
3. Java的异常处理机制也允许自行抛出异常
四、异常处理
Java的异常处理是通过5个关键字实现的
① try、② catch、 ③finally、④throw、⑤ throws
五、常用的异常处理结构
try { //有可能出现异常的语句 }[catch(异常类型 异常对象) { //异常处理语句 }] [finally { //一定会运行到的语句 }]
六、try-catch块
使用try-catch块捕获异常,分为三种情况
第一种情况(正常)
public static void main(String[] args) { try { // 代码段(此处不会产生异常) } catch (异常类型 ex) { // 对异常进行处理的代码段 } // 代码段 }
第二种情况:出现异常
public static void main(String[] args) { try { // 代码段 1 // 产生异常的代码段 2 // 代码段 3 } catch (异常类型 ex) { // 对异常进行处理的代码段4 } // 代码段5 }
示例:使用try-catch语句处理接受果商数为0的异常
import java.util.Scanner; /** * 计算果商供应量 */ /* 使用try-catch语句处理异常 */ public class Test3 { public static void main(String[] args) { Scanner input=new Scanner(System.in); try { System.out.print("请输入果实采摘量(公斤):"); int weight=input.nextInt(); System.out.print("请输入果商数(家):"); int num=input.nextInt(); System.out.println("每家果商供应"+weight/num+"公斤水果。"); System.out.println("欢迎再来,预祝生意兴隆!"); }catch (Exception ex){ System.out.println("出现错误:采摘量和果商数应为整数,果商数应大于零!"); } } }
运行结果:
在catch块中处理异常
加入用户自定义处理信息
System.err.println("出现错误:采摘量和果商数应为整数,果商数应大于零! ");
调用方法输出异常信息
e.printStackTrace();
异常对象常用的方法
方法名 说 明 void printStackTrace() 输出异常的堆栈信息 String getMessage() 返回异常信息描述字符串, 是printStackTrace()输出信息的一部分 printStackTrace()的堆栈跟踪功能显示出程序运行到当前类的执行流程
try { //省略代码 } catch (Exception ex) { System.err.println("出现错误:采摘量和果商数应为整数,果商数应大于零!"); ex.printStackTrace(); //输出完整异常信息 }
第三种情况:异常类型不匹配
public static void main(String[] args) { try { // 代码段 1 // 产生异常的代码段 2 // 代码段 3 } catch (异常类型 ex) { // 对异常进行处理的代码段4 } // 代码段5 }
七、try-catch-finally
在try-catch块后加入finally块
是否发生异常都执行
在try-catch块后加入finally块,当存在 return的try-catch-finally块
finally唯一不执行的情况
八、多重catch块
程序中可能存在多种异常类型不同的异常类型有不同的处理方式
引发多种类型的异常
1. 排列catch 语句的顺序:先子类后父类
2. 发生异常时按顺序逐个匹配
3. 只执行第一个与异常类型匹配的catch语句