Java异常之自定义异常类详解和代码举例

Java语言的异常

异常处理机制

  1. Java中的异常概念
    1. 异常是程序在运行过程中由于算法问或软件设计等问题导致的程序异常事件。
    2. 异常的前提是可以识别并被捕获的。
    3. Java以面向对象的方法来处理异常的;Java提供了各种类型的异常类。
    4. Java允许自定义异常类。
  2. Java异常的产生过程
    1. 程序运行若发生异常,就会触发能被监听器捕获的异常事件,该事件的处理程 序会生成一个对应的
    异常对象并交给JVM,由 JVM查找相应的代码处理该异 常。
    2. 生成异常对象并将其交给JVM的过程称为捕获异常。
    3. 常本身作为一个对象,即产生一个异常就是产生一个异常对象;异常对象可 能由应用程序本身产
    生,也可能由JVM产生,这取决于异常的种类。
  3. 异常的本质
    1 .每个异常类都代表一种运行错误,类中包含错误信息及错误处理的方法等内容。
    2. 异常本质上是一个程序运行时发生的事件,该事件将导致程序的运行中断;尽 管如此,在处理异常
    的代码中可以调整程序运行的方向,使程序仍可继续执行。
  4. 异常的处理
    1. 程序产生异常,系统捕获异常,程序员编写异常处理程序。

异常处理类

  • 在 Java 中,Throwable 类是 Java 语言中所有错误或异常的超类,它有两个直接子类:Error和Exception。
  • Error类及其子类代表了程序运行时Java系统内部的错误,程序设计者无能为力,程序也不能从Error中恢复,因此不必处理它们,从技术上讲Error不是异常。
  • Exception类及其子类代表了用户程序能够捕捉到的异常,因此应该是程序设计者要关心的、尽可能要处理的部分。

异常的处理

在 Java 中,通常用 trycatchfinally 捕捉并处理异常,用 throw是方法里面抛、throws是在方法上抛出异常。

   使用try-catch-finally捕获和处理异常 语法结构: 
 	try{   
 		要检查的语句序列:可能要抛出异常的代码 
 	}catch(异常类名 形参对象名){   
 		异常发生时处理的语句序列 
 	}finally{   
 		无论是否产生异常,都要执行这部分语句 
 	} 

例如:

Scanner scn=new Scanner(System.in);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
System.out.println("请输入出生日期(yyyy-MM-dd):");
String strBirth=scn.next();
try {
    Date birth=sdf.parse(strBirth);
    System.out.println("生日:"+birth);
}catch(ParseException pe) {
    System.out.println("生日错误!");
    pe.printStackTrace();
}finally {
    System.out.println("程序执行finally块!");
        }

多异常的处理

  • 多异常需要程序设计者熟悉各类异常。初学者在不熟悉各种异常类的情况下可 以使用Exception类。
  • 多异常的处理思想与switch-case结构非常类似。

抛出异常

  • 1.在捕获异常之前,必须有一段代码生成并抛出一个异常对象。
  • 2.异常类型不同,抛出异常的方法也不同,分为:系统自动抛出的异常指定方法抛出的异常
  • 3.系统定义的异常由系统抛出;指定方法抛出的异常需使用关键字throwthrows

我们主要讨论由方法抛出的异常用法。

  • 抛出异常的方法与调用方法处理异常
    1.异常的产生和处理可以在一个方法内进行;
    2.异常的产生和处理也可以不在一个方法中,即一个方法产生异常,由该方法的调用者去处理异常 相对应地,异常有关的方法就有两个:有抛出异常的方法 和处理异常的方法。

  • 抛出异常的方法
    1.在方法体内使用throw抛出异常:throw 由异常类产生的对象;
    2.在方法头部添加throws抛出异常
    [修饰符] 返回值类型 方法名([参数列表]) throws 异常列表{
    … …
    }
    由上述两种方式抛出异常,在该方法内就不必提供 try-catch-finally块去处理异常,有调用者的程序处理。

  • 处理异常的方法
    1.如果程序设计者调用了一个会抛出异常的方法,要么try-catch处理这个异常,要么将异常继续抛出。

样例:
1.直接抛

package Test.javawork.hextodecString;


/**
 * @author : xjszsd
 * @date : 2022-05-05 16:29
 */
public class HexString{

    public static String hexToDecString(String hexString) throws HexFormatException {
        String regex="^[A-Fa-f0-9]+$";
        if(!hexString.matches(regex))
        throw new HexFormatException(hexString+"不是16进制");//在方法里面抛异常,但不处理,由方法体抛出,调用者去处理
        return "是16进制";
    }

    public static void main(String[] args) {

        String s = null;
        try {
            s = HexString.hexToDecString("123we");
        } catch (HexFormatException e) {
            e.printStackTrace();
        }
        System.out.println(s);
    }
}

2.直接处理。

package Test.javawork.hextodecString;


/**
 * @author : xjszsd
 * @date : 2022-05-05 16:29
 */
public class HexString{

    public static String hexToDecString(String hexString) {
        String regex="^[A-Fa-f0-9]+$";
        if(!hexString.matches(regex))
            try {
                throw new HexFormatException(hexString+"不是16进制");//在方法里面抛异常,但不处理,由方法体抛出,调用者去处理
            } catch (HexFormatException e) {
                e.printStackTrace();
            }
        return "是16进制";
    }

    public static void main(String[] args) {

        String s = HexString.hexToDecString("123we");
        System.out.println(s);

    }
}
  • 注意直接抛是不会运行后面的程序的直接就停止了。直接处理的话,处理完之后就会继续运行接下面的程序。

自定义异常类

java提供的异常类,不够我们使用,需要我们自己定义一些异常类
格式:

public class XXXXException extends Exception 或者RuntimeException{
          添加一个空参构造方法
          添加一个带异常信息的构造方法
  }

注意:

  • 自定义异常类一般都是以Exception结尾,说明该类是个异常类
  • 自定义异常类,必须继承Exception 或者RuntimeException继承Exception的话:那么自定义的异常类就是一个编译期异常,如果方法内部抛出了编译器异常,就必须处理这个异常,要么Try()。。。。catch或者throws
    继承RuntimeException的话:那么这个自定义的异常类就是一个运行期异常,无需处理,直接抛,直接交给虚拟机处理(中断处理)

例自定义类:

package Test.javawork.hextodecString;

/**
 * @author : xjszsd
 * @date : 2022-05-05 16:29
 */
public class HexFormatException extends Exception{

    public HexFormatException(String message) {
        super(message);

    }

}
package Test.javawork.hextodecString;


public class HexString{
    
    public static String hexToDecString(String hexString) throws HexFormatException {

        String regex="^[A-Fa-f0-9]+$";
        if(!hexString.matches(regex))
        throw new HexFormatException(hexString+"不是16进制");

        return "是16进制";
    }

    public static void main(String[] args) {

        String s = null;
        try {
            s = HexString.hexToDecString("123we");
        } catch (HexFormatException e) {
            e.printStackTrace();
        }
        System.out.println(s);

    }
}
  • 9
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,我们可以通过创建自定义异常来提供更详细的错误信息。自定义异常继承自Java提供的Exception或其子,对于需要打印非堆栈信息的自定义异常,我们可以通过重写Exception的toString()方法来实现。 在自定义异常中,我们可以添加额外的成员变量来保存非堆栈信息,例如错误代码、错误描述等。然后,在toString()方法中,可以通过格式化字符串的方式将这些信息打印出来。 以下是一个示例的自定义异常: ```java public class MyException extends Exception { private int errorCode; private String errorMessage; public MyException(int errorCode, String errorMessage) { this.errorCode = errorCode; this.errorMessage = errorMessage; } @Override public String toString() { return "错误代码:" + errorCode + "\n错误描述:" + errorMessage; } } ``` 在使用该自定义异常的时候,我们可以通过创建异常对象,并将非堆栈信息传递给构造方法来初始化异常对象。当异常被抛出并捕获时,可以通过调用异常对象的toString()方法来获取非堆栈信息并打印出来。 以下是一个使用自定义异常的示例: ```java public class Main { public static void main(String[] args) { try { throw new MyException(1001, "自定义异常测试"); } catch (MyException e) { System.out.println(e.toString()); } } } ``` 运行上述代码,将输出自定义异常的非堆栈信息: ``` 错误代码:1001 错误描述:自定义异常测试 ``` 通过重写Exception的toString()方法,我们可以自定义异常的非堆栈信息的格式和内容,从而提供更详细的错误信息供调试和日志记录使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值