Java OOP 异常

目录

一、程序中的异常

二、什么是异常

  三、程序中的异常处理

 四、异常处理

五、常用的异常处理结构

六、try-catch块

 七、try-catch-finally

八、多重catch块

九、异常的分类

十、本章总结


一、程序中的异常

丰收时节,星沐生态农场将采摘的水果平均分给每家果商,编程实现计算每家果商可以分到的蔬果重量

/**
 * 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语句

九、异常的分类

十、本章总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值