【Java】异常

前言

1.之前学过,因此本文是个人复习笔记,为视频的总结以及个人思考,可能不是很详细。

2.教程是b站黑马程序员的JAVASE基础课程,笔记中的大部分图片来自于视频中的PPT截图。

3.Java环境为Java SE 17.0.3.1,IntelliJ IDEA版本为2025.2

https://www.bilibili.com/video/BV1Cv411372m

内容概览

1.本文内容主要包括异常的体系,自定义异常,以及异常的处理

2.笔记对应视频134~135节

更新记录

异常的体系

Error:代表的系统级别错误(属于严重问题),也就是说系统一旦出问题,sun公司会把这些问题封装成Error对象给出来

Exception:异常,代表的是我们程序可能出现的问题

  • 运行时异常:RuntimeException及其子类,编译阶段不会出现错误提醒,运行时出现的异常(如:数组索引越界异常)
  • 编译时异常:编译阶段就会出现错误提醒的。(如:日期解析异常)

Exception1.java

Java 复制代码
package com.zbhgis.exceptions;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Exceptions1 {
    // 解决异常方式二:添加ParseException
    public static void main(String[] args) throws ParseException{
        // 运行时异常
        // int[] arr = {11, 22, 33};
        // System.out.println(arr[5]);

        // 编译时异常
        // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // Date d = sdf.parse("2022");
        // System.out.println(d);

        // 解决异常方式一:try-catch
        // try {
        //     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //     Date d = sdf.parse("2022");
        //     System.out.println(d);
        // } catch (ParseException e) {
        //     e.printStackTrace();
        // }

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = sdf.parse("2022");
        System.out.println(d);
    }
}

打印结果

Plain 复制代码
Exception in thread "main" java.text.ParseException: Unparseable date: "2022"
        at java.base/java.text.DateFormat.parse(DateFormat.java:399)
        at com.zbhgis.exceptions.Exceptions1.main(Exceptions1.java:29)

自定义异常

自行定义异常类

自定义运行时异常

定义一个异常类继承RuntimeException,重写构造器,通过throw new 异常类() 来创建异常对象并抛出。IDEA反馈较弱

AgeIllegalRuntimeException

Exceptions2.java

TypeScript 复制代码
package com.zbhgis.exceptions;

public class Exceptions2 {
    public static void main(String[] args) {
        try {
            saveAge(160);
            System.out.println("底层执行成功");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("底层出现了bug");
        }
    }

    private static void saveAge(int age) {
        if(age > 0 & age < 150){
            System.out.println("年龄被成功保存:" +age);
        } else {
            throw new AgeIllegalRuntimeException("age " + age + " is illegal");
        }
    }
}

打印结果

Plain 复制代码
com.zbhgis.exceptions.AgeIllegalRuntimeException: age 160 is illegal
        at com.zbhgis.exceptions.Exceptions2.saveAge(Exceptions2.java:18)
        at com.zbhgis.exceptions.Exceptions2.main(Exceptions2.java:6)
底层出现了bug

自定义编译时异常

定义一个异常类继承Exception,重写构造器,通过throw new 异常类() 来创建异常对象并抛出。IDEA反馈较强。

Exceptions3.java

Java 复制代码
package com.zbhgis.exceptions;

public class Exceptions3 {
    public static void main(String[] args) {
        try {
            saveAge(161);
            System.out.println("底层执行成功");
        } catch (AgeIllegalException e) {
            e.printStackTrace();
            System.out.println("底层出现了bug");
        }

    }

    private static void saveAge(int age) throws AgeIllegalException{
        if(age > 0 & age < 150){
            System.out.println("年龄被成功保存:" +age);
        } else {
            throw new AgeIllegalException("age " + age + " is illegal");
        }
    }
}

打印结果

Plain 复制代码
com.zbhgis.exceptions.AgeIllegalException: age 161 is illegal
        at com.zbhgis.exceptions.Exceptions3.saveAge(Exceptions3.java:19)
        at com.zbhgis.exceptions.Exceptions3.main(Exceptions3.java:6)
底层出现了bug

异常的处理

1.捕获异常,记录异常并响应合适的信息给用户

Exceptions4.java

Java 复制代码
package com.zbhgis.exceptions;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Exceptions4 {
    public static void main(String[] args){
        // 以下也可以直接抛出Exception,不需要具体的异常
        try {
            test1();
        } catch (ParseException e) {
            System.out.println("解析的时间有问题");
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            System.out.println("要找的文件不存在");
            e.printStackTrace();
        }
    }

    private static void test1() throws ParseException, FileNotFoundException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // Date d = sdf.parse("2025");
        // System.out.println(d);
        // 此处报错:
        /*
        java.text.ParseException: Unparseable date: "2025"
            at java.base/java.text.DateFormat.parse(DateFormat.java:399)
            at com.zbhgis.exceptions.Exceptions4.test1(Exceptions4.java:26)
            at com.zbhgis.exceptions.Exceptions4.main(Exceptions4.java:14)
        解析的时间有问题
         */

        Date d2 = sdf.parse("2025-12-11 03:03:03");
        System.out.println(d2);

        test2();
    }

    private static void test2() throws FileNotFoundException {
        InputStream is = new FileInputStream("D:/test.png");
    }
}

打印结果

Plain 复制代码
要找的文件不存在
java.io.FileNotFoundException: D:\test.png (系统找不到指定的文件。)
        at java.base/java.io.FileInputStream.open0(Native Method)
        at java.base/java.io.FileInputStream.open(FileInputStream.java:216)
        at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
        at java.base/java.io.FileInputStream.<init>(FileInputStream.java:111)
        at com.zbhgis.exceptions.Exceptions4.test2(Exceptions4.java:44)
        at com.zbhgis.exceptions.Exceptions4.test1(Exceptions4.java:40)
        at com.zbhgis.exceptions.Exceptions4.main(Exceptions4.java:14)

或者将上述代码的操作进行简化

Exceptions5.java

Java 复制代码
package com.zbhgis.exceptions;

import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Exceptions5 {
    public static void main(String[] args){
        // 以下也可以直接抛出Exception,不需要具体的异常
        try {
            test1();
        } catch (Exception e) {
            System.out.println("操作有问题");
            e.printStackTrace();
        }
    }

    private static void test1() throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // Date d = sdf.parse("2025");
        // System.out.println(d);
        // 此处报错:
        /*
        操作有问题
        java.text.ParseException: Unparseable date: "2025"
            at java.base/java.text.DateFormat.parse(DateFormat.java:399)
            at com.zbhgis.exceptions.Exceptions5.test1(Exceptions5.java:21)
            at com.zbhgis.exceptions.Exceptions5.main(Exceptions5.java:12)
         */

        Date d2 = sdf.parse("2025-12-11 03:03:03");
        System.out.println(d2);

        test2();
    }

    private static void test2() throws Exception {
        InputStream is = new FileInputStream("D:/test.png");
    }
}

打印结果

Plain 复制代码
Thu Dec 11 03:03:03 CST 2025
操作有问题
java.io.FileNotFoundException: D:\test.png (系统找不到指定的文件。)
        at java.base/java.io.FileInputStream.open0(Native Method)
        at java.base/java.io.FileInputStream.open(FileInputStream.java:216)
        at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
        at java.base/java.io.FileInputStream.<init>(FileInputStream.java:111)
        at com.zbhgis.exceptions.Exceptions5.test2(Exceptions5.java:41)
        at com.zbhgis.exceptions.Exceptions5.test1(Exceptions5.java:37)
        at com.zbhgis.exceptions.Exceptions5.main(Exceptions5.java:14)

2.捕获异常,尝试重新修复

Exceptions6.java

Java 复制代码
package com.zbhgis.exceptions;

import java.util.Scanner;

public class Exceptions6 {
    public static void main(String[] args) {
        while (true) {
            try {
                System.out.println(getMoney());
                break;
            } catch (Exception e) {
                System.out.println("请输入合法的数字");
            }
        }

    }

    private static double getMoney() {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入合适的价格");
            double money = sc.nextDouble();
            if (money >= 0) {
                return money;
            } else {
                System.out.println("输入价格不合适");
            }
        }
    }
}

打印结果

Plain 复制代码
请输入合适的价格
-2
输入价格不合适
请输入合适的价格
61f
请输入合法的数字
请输入合适的价格
564s
请输入合法的数字
请输入合适的价格
4
4.0

总结

1.异常可以使程序更加稳健

2.处理异常时可以选择直接抛出Exception,减少代码量

相关推荐
superman超哥15 小时前
Rust HashSet与BTreeSet的实现细节:集合类型的底层逻辑
开发语言·后端·rust·编程语言·rust hashset·rust btreeset·集合类型
张np15 小时前
java基础-LinkedHashMap
java·开发语言
gihigo199815 小时前
基于MATLAB的周期方波与扫频信号生成实现(支持参数动态调整)
开发语言·matlab
Groundwork Explorer15 小时前
WSL Python Kivy Buildozer APK打包笔记
笔记
行者9615 小时前
Flutter适配OpenHarmony:国际化i18n实现中的常见陷阱与解决方案
开发语言·javascript·flutter·harmonyos·鸿蒙
csbysj202015 小时前
RSS 阅读器:全面解析与使用指南
开发语言
AI偶然15 小时前
AI智能体|扣子(Coze)搭建【自动生成AI漫剧】Agent
经验分享
毕设源码-朱学姐15 小时前
【开题答辩全过程】以 高校图书馆管理系统为例,包含答辩的问题和答案
java
xie_pin_an16 小时前
C++ 从入门到进阶:核心知识与实战指南
java·c++·算法