Java如何自定义异常?

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

        如果程序出现了问题,我们没有做任何处理,最终JVM 会做默认的处理,处理方式有如下两个步骤:把异常的名称,错误原因及异常出现的位置等信息输出在了控制台程序停止执行。

  • 程序从 try 里面的代码开始执行
  • 出现异常,就会跳转到对应的 catch 里面去执行
  • 执行完毕之后,程序还可以继续往下执行

提示:以下是本篇文章正文内容,下面案例可供参考

一、异常分为哪几种?

异常分为两种,分别是编译异常运行时异常

        编译时异常

  • 都是Exception类及其子类
  • 必须显示处理,否则程序就会发生错误,无法通过编译

        运行时异常

  • 都是RuntimeException类及其子类
  • 无需显示处理,也可以和编译时异常一样处理

        

package com.xxgc.chop5_2.test;

public class ExceptionDemo {
    public static void show4(){
        //把字符串转换int类型
        String a="张三";
        int b=Integer.parseInt(a);//NumberF
    }
    //异常抛出
    public static void show3() throws ClassNotFoundException {
        Class.forName("Student");
    }
    public static void show2(){
        //运行时异常:程序运行的时候出现的异常,可以try
        //编译时异常(非运行时异常):必须try catch 或者向上抛出
        try {
            Class.forName("Student");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }
    }
    public static void show() {
        //制造一个异常,捕获异常,处理异常
        try{
           int []nums={1,2};
           int n=10/0;
           int a=nums[3];
        }catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
            System.out.println("数组下标出错了");
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("出错了");
        }finally {
            //最终最后都要之心的代码,一般完成资源释放工作
            System.out.println("最终的!!!");
        }
    }

    public static void main(String[] args) {
        //trows:向上抛出异常,抛给方法的调用者
        //show3()方法向上抛出了异常,需要main方法解决
        //1.main方法解决了
        //2.main没解决完,继续向上抛,jvm(Java虚拟机)解决
        try {
            show3();
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}

二、自定义异常

1.首先新建一个类

        这个类是自定义异常的类,首先我们进行继承idea的RuntimeException,其次建立有参和无参的方法。

代码如下(示例):

package com.xxgc.ch06.po;

public class MyException extends RuntimeException{
    public MyException(){

    }
    public MyException(String s){
        super(s);
    }

}

2.测试类

        下面新建一个测试类,main方法和shou方法。在shou方法里定义一个int类型的a,进入if判断a是否异常。

代码如下(示例):

package com.xxgc.ch06.test;

import com.xxgc.ch06.po.MyException;

public class ThrowDemo {
    public static void show(){
        //如果a>10,抛出自己的异常
        int a=13;
        if (a>10){
            try {
                throw new MyException("不能大于10");
            }catch (MyException e){
                e.printStackTrace();
                System.out.println("出错啦!"+e.getMessage());
            }


        }
        System.out.println("扶苏");
    }

    public static void main(String[] args) {
        show();
    }
}

该处使用的idea软件。


总结

这里对文章进行总结:
以上就是今天要讲的内容,Java自定义异常需要新建一个类写入有参无参方法,此类需要继承idea的RuntimeException异常。下面就需要进行测试是否会显示。

以下为运行结果:

com.xxgc.ch06.po.MyException: 不能大于10
    at com.xxgc.ch06.test.ThrowDemo.show(ThrowDemo.java:11)
    at com.xxgc.ch06.test.ThrowDemo.main(ThrowDemo.java:23)
出错啦!不能大于10
扶苏

进程已结束,退出代码0

<think>首先,用户的问题是:“我想了解如何在Java中创建自定义异常请问Java创建自定义异常的最佳实践”。这基于之前的引用内容,我需要参考提供的引用。回顾引用:-引用[1]:提到Java自定义异常类的最佳实践,包括创建自定义异常类以满足特定需求。-引用[2]:讨论自定义异常的原理、用法和最佳实践,包括提升可读性和用户体验。-引用[3]:强调命名规范,如以Exception结尾。-引用[4]:是关于自定义线程池的,不直接相关,但可能间接参考。用户的问题焦点是“Java创建自定义异常的最佳实践”,所以我需要专注于回答这个。系统指令:-所有行内数学表达式用$...$,但这里可能没有数学内容。-独立公式用$$...$$,同样可能不适用。-LaTeX语法正确,但Java代码不是LaTeX,所以我会用代码块。-使用中文回答。-生成相关问题。-引用的段落末尾添加引用标识,例如[^1]。-回答结构清晰,逐步解决问题,保证真实可靠。回答结构:1.**介绍自定义异常**:简要解释为什么需要自定义异常。2.**最佳实践**:列出关键点,基于引用。-命名规范:以Exception结尾(来自引用[3])。-继承适当类:通常是Exception或RuntimeException。-提供构造函数。-添加额外信息。-保持简洁和特定。-处理异常。3.**示例代码**:提供一个Java代码示例。4.**总结**:强调重要性。5.**生成相关问题**:在末尾添加相关问题。确保真实可靠:我基于提供的引用内容。引用[1],[2],[3]直接相关。添加引用标识:在回答中,当引用特定点时,在末尾加[^n]。生成相关问题:在回答结束时,添加“§§相关问题§§”部分,列出3-4个相关问题。最终输出格式:-用户可见层:回答结构清晰。-结尾有相关问题。现在,大纲回答:1.**引言**:解释自定义异常的作用和必要性,参考引用[1]和[2]。2.**最佳实践**:-命名规范:以Exception结尾[^3]。-继承:选择Exception(检查型)或RuntimeException(非检查型)[^1]。-构造函数:提供无参和带消息的构造函数[^2]。-添加字段:为特定场景添加额外字段[^2]。-避免过度使用:只在必要时创建[^1]。-处理:在代码中适当抛出和捕获[^2]。3.**代码示例**:展示一个自定义异常类的定义。4.**相关问题**:生成3个相关问题。相关问题想法:1.自定义异常和内置异常的区别是什么?2.如何测试自定义异常?3.自定义异常在大型项目中的应用场景?4.自定义异常的性能影响?(可选)确保语言中文。</think>### Java中创建自定义异常的最佳实践 在Java编程中,自定义异常允许开发者根据特定业务需求创建更精确的错误处理机制,提升代码的可读性和用户体验。Java提供了内置异常类(如 `Exception` 或 `RuntimeException`),但在复杂场景下,自定义异常能更好地封装错误细节,便于维护和调试[^1]。以下基于最佳实践,逐步解释如何创建自定义异常。这些实践源自行业经验,确保异常处理的可靠性和效率。 #### 1. **命名规范:清晰且一致** - 自定义异常类名应以 `Exception` 结尾,例如 `InvalidInputException` 或 `FileProcessingException`,这样能一目了然地表明其类型[^3]。 - 避免使用泛泛的名称(如 `MyException`),而应描述具体错误场景,例如 `UserAuthenticationException`。 - 这有助于团队协作和代码审查,减少误解。 #### 2. **继承适当的父类** - 自定义异常应继承自Java的核心异常类: - 如果错误需要强制处理(检查型异常),继承 `Exception` 类。 - 如果错误是运行时不可恢复的(非检查型异常),继承 `RuntimeException` 类[^2]。 - 例如:`public class CustomValidationException extends Exception` 表示一个必须捕获的验证错误。 - 选择正确的父类能优化异常处理流程,避免不必要的 `try-catch` 块[^1]。 #### 3. **提供完整的构造函数** - 定义多个构造函数以支持不同场景: - 无参构造函数:用于简单错误。 - 带消息的构造函数:传递错误描述。 - 带原因参数的构造函数:包装底层异常(如 `Throwable`),便于追踪根源。 - 示例代码: ```java public class PaymentFailedException extends RuntimeException { // 无参构造函数 public PaymentFailedException() { super(); } // 带错误消息的构造函数 public PaymentFailedException(String message) { super(message); } // 带错误消息和原因的构造函数 public PaymentFailedException(String message, Throwable cause) { super(message, cause); } } ``` - 这种做法确保异常信息丰富且易于调试[^2]。 #### 4. **添加自定义字段和方法** - 根据业务需求,添加额外字段存储上下文信息,例如错误代码、时间戳或相关对象。 - 提供Getter方法访问这些字段,但避免添加复杂逻辑,保持异常类轻量。 - 示例: ```java public class OrderProcessingException extends Exception { private int errorCode; // 自定义错误代码字段 public OrderProcessingException(String message, int errorCode) { super(message); this.errorCode = errorCode; } public int getErrorCode() { return errorCode; } } ``` - 这提升了异常的实用性,帮助在日志中快速定位问题[^2]。 #### 5. **保持简洁和特定** - 只为真正需要自定义的场景创建异常,避免过度设计。如果内置异常(如 `IllegalArgumentException`)足够使用,则无需自定义[^1]。 - 确保异常类只负责错误封装,不包含业务逻辑。例如,在验证用户输入时抛出 `InvalidUserInputException`,而非在异常类内执行验证。 - 这符合单一职责原则,减少代码冗余[^3]。 #### 6. **在代码中正确使用** - 抛出异常时,使用 `throw` 关键字并提供清晰消息:`throw new CustomValidationException("输入值无效")`。 - 捕获异常时,优先处理特定自定义异常,而非泛泛的 `Exception`: ```java try { // 业务代码 } catch (CustomValidationException e) { System.err.println("验证错误: " + e.getMessage()); // 记录日志或恢复操作 } ``` - 最佳实践还包括在API文档中使用 `@throws` 注解说明自定义异常,提升代码可维护性[^2]。 #### 总结 自定义异常Java中是提升错误处理灵活性的关键工具。遵循上述实践(如命名规范、继承选择和构造函数设计),能确保异常机制高效可靠,适用于用户认证、数据验证等场景[^1][^3]。记住,异常处理的目标是改善用户体验和系统健壮性,因此始终测试自定义异常的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没白头发的扶苏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值