跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java 异常处理:捕获规则与自定义异常

综述由AI生成Java 异常处理的两个核心方面。首先讲解了异常捕获规则,包括使用父类 Exception 一次性捕获多个异常的风险、catch 块中子类异常需排在父类之前的顺序要求,以及 finally 块在资源回收和返回值覆盖方面的行为特性。其次阐述了自定义异常的实现方法,通过继承 Exception 类构建符合业务场景的异常结构,并以登录系统为例展示了如何抛出和处理自定义的用户名及密码异常。

赛博行者发布于 2026/3/21更新于 2026/6/239 浏览
Java 异常处理:捕获规则与自定义异常

一、异常的捕获

1.1. 多个异常,一次捕获

由于 Exception 类是所有异常类的父类,因此可以用这个类型表示捕捉所有异常。这种写法不推荐,因为编译器会提示有风险但不指明具体风险。

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        try {
            System.out.println("before");
            arr = null;
            System.out.println(arr[100]);
            System.out.println("after");
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("after try catch");
    }
}

文章配图

1.2. 异常之间的父子关系

如果异常之间具有父子关系,子类异常必须在父类异常之前被 catch,否则语法错误。例如 NullPointerException 是 RuntimeException 的子类,若先 catch RuntimeException,则第二个 catch 无法到达。

public class Main {
    public static void main(String[] args) {
        try {
            throw new NullPointerException();
        } catch (RuntimeException e) {
            System.out.println("捕获运行时异常");
            e.printStackTrace();
        } catch (NullPointerException e) {
            //Exception 'java.lang.NullPointerException' has already been caught
            System.out.println("捕获空指针异常");
        }
    }
}

1.3. finally

finally 用于确保资源回收,无论是否发生异常都会执行。在程序正常或异常退出时,必须对资源(如网络连接、数据库连接、IO 流)进行回收。

语法规则:

try {
    //可能发生的异常;
} catch(异常类型 e){
    //对捕获的异常进行处理;
} finally {
    //此处的语句无论是否发生异常,都会被执行到;
}

示例代码:

public class Main {
    public static void main(String[] args) {
        try {
            if (cond1) {
                release();
                return;
            }
            if (cond2) {
                throw new Exception("某些未知异常");
            }
            release();
        } catch (Exception e) {
            release();
        } finally {
            release();
        }
    }
    private static void release() {}
}

针对 return 语句导致 finally 前代码未执行的情况,使用 finally 可保证资源释放。

public class Main {
    public static void main(String[] args) {
        try {
            int a = 1;
            int b = 2;
            if (a < b) {
                throw new NullPointerException("a 小于 b");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            release();
        }
    }
    private static void release() {
        System.out.println("release 释放资源");
    }
}

文章配图

关于返回值覆盖:

public class Main {
    public static int func() {
        try {
            return 10;
        } catch (Exception e) {
            return 20;
        } finally {
            return 30;
        }
    }
    public static void main(String[] args) {
        System.out.println(func());
    }
}

结果为 30。这是因为 finally 块中的返回值会覆盖 try 或 catch 中的返回值。

二、自定义异常

Java 内置异常类不能完全表示实际开发中遇到的业务异常,需要根据业务类型自定义异常结构。异常本质是类,继承自 Java 标准库的异常(如 Exception、RuntimeException)。

以下是一个登录系统的示例:

//创建异常类
class UsernameException extends Exception {}
class PasswordException extends Exception {}

//设置登录系统
class Login {
    private String username = "crane";
    private String password = "24170";

    public void login(String username, String password) throws UsernameException, PasswordException {
        if (!username.equals(this.username)) {
            throw new UsernameException();
        }
        if (!password.equals(this.password)) {
            throw new PasswordException();
        }
        System.out.println("登录成功");
    }
}

public class Main {
    public static void main(String[] args) {
        Login lg = new Login();
        try {
            lg.login("night", "123456");
        } catch (UsernameException e) {
            System.out.println("用户名错误");
        } catch (PasswordException e) {
            System.out.println("密码错误");
        }
    }
}

目录

  1. 一、异常的捕获
  2. 1.1. 多个异常,一次捕获
  3. 1.2. 异常之间的父子关系
  4. 1.3. finally
  5. 二、自定义异常
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • OpenClaw 自动化 AI 智能体跨平台部署与日常使用教程
  • Unity VR Pico 开发环境配置与一键设置指南
  • 数据结构:常见排序算法详解
  • 苹果 M 系列芯片运行 Vivado 的 Docker 部署指南
  • DeepSeek-OCR-WebUI 详解:边界框可视化与多模态识别
  • 系统分析师:通信与网络安全及系统访问控制技术
  • OpenClaw 对接腾讯 QQ 实战操作详解
  • 2025年12月C++知识竞赛一级考试真题解析
  • Java String.format() 完整用法指南
  • 法奥机器人ROS2环境搭建
  • LLaMA-Factory 大模型微调实战指南
  • 腾讯算法岗面试经验总结:机器学习与大模型基础
  • ChatGLM3 大模型本地化部署、应用开发与微调
  • 网络安全行业薪资水平与人才需求分析
  • Java Web 开发入门:基础概念、环境搭建与核心技术
  • JDK 安装与环境配置实战指南
  • Spring Web MVC 入门与实战详解
  • 微博爬虫 Web 管理界面配置手册
  • 前端 WebSocket 实战:替代轮询的实时通信方案
  • PicoClaw 轻量级 AI 助手安装与使用指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online