自定义异常:
JAVA无法为这个世界上全部的问题都提供异常类来代表。如果企业自己的某种问题,想通过异常来表示,以便用异常来管理该问题,那就需要自己来定义异常类。
自定义异常的种类:
自定义运行时异常
自定义运行时异常(Custom Runtime Exception)在Java编程中扮演着重要的角色,尤其是在处理那些不需要强制调用者进行异常处理的错误情况时。这些异常通常继承自RuntimeException
类或其子类,并且由于它们是“非受检的”,因此不需要在方法签名中显式声明抛出。下面详细讲解自定义运行时异常的几个关键点:
1. 继承自RuntimeException
自定义运行时异常首先必须继承自RuntimeException
类或其任何子类。这样做的原因是RuntimeException
及其子类代表了在Java程序中可能发生的运行时错误,这些错误通常是由于编程错误或意外的运行时条件导致的,而不是由于调用者的错误。
2. 构造函数
自定义运行时异常类通常会定义至少一个构造函数,该构造函数接受一个字符串参数作为错误消息。这个字符串将被传递给RuntimeException
的构造函数,以便在异常被抛出时能够提供一个有用的错误描述。
代码解释:
package day5; //因为是异常,必须让这个类继承自RuntimeException才能成为一个运行时异常类。 public class AgeillegalRuntimeException extends RuntimeException { //直接右键,菜单点开Generate,然后找到构造器 public AgeillegalRuntimeException() { } public AgeillegalRuntimeException(String message) {//这个参数用于封装问题的原因。 super(message); } } public class Demo1 { public static void main(String[] args) { try { setAge(200); System.out.println("底层执行成功"); } catch (Exception e) { e.printStackTrace(); System.out.println("底层出现了bug"); } //他一旦出现这个问题,他会用一个异常对象的形式抛上来, //抛上来之后呢,这边想办法把异常对象呢给抓住,怎么抓住呢? //你可以选中这个代码,按住ctrl Alt加T键。 //选择第6个,他就可以把这个方法调用的时候可能从底层抛出的异常对象给抓住。 //这边呢他是把这个异常对象信息给打印出来了 //我们还可以在这个地方提示一下,比如说底层出现了bug } public static void setAge(int age){ if(age>0&&age<150){ System.out.println("年龄合法 "+age); }else{ // System.out.println("年龄不合法");这样写太LOW了,上层调用者不知道 // 并且这个年龄非法。不属于JAVA的异常。所以我们需要自定义异常。 throw new AgeillegalRuntimeException("you age are illegal "+age); //其实我们就用这个自定义异常类创建了一个异常对象封装的这个年纪非法的问题 //接着要注意,你要把这个异常对象抛到上面去,别人才知道底层出现了什么问题? //怎么抛呢?你要用一个关键字throw,它指的就是抛出去这个异常对象 //抛到方法的入口这里,再抛给他的调用者(main) } } } //保存200的时候,它首先在这个地方出现了一个叫做年龄非法的异常啊, //然后他说的是原因是你的年龄是非法的,年龄是200,跟那个官方是不是一样的? //他怎么做的?你调这个方法的时候把200传给这个age,然后它就到这个分支这边来了, //他就知道这个年龄呢就有问题了,他就把了异常对象又创建出来, //然后把这个问题的原因呢封装起来,再把这整个异常对象又从这个地方抛给调用者, //抛掉的异常对象就会直接跳到这个地方来被catch抓住,catch抓住之后,他会把这个异常对象信息打印
自定义编译时异常
自定义编译时异常和自定义运行时异常。非常相似。我们只需要把那个运行时异常类改为编译时异常类。
package day5; //因为是异常,必须让这个类继承自Exception才能成为一个编译时异常类。 public class AgeillegaException extends Exception { //直接右键,菜单点开Generate,然后找到构造器 public AgeillegaException() { } public AgeillegaException(String message) {//这个参数用于封装问题的原因。 super(message); } }
其余过程见下图:
如何选择?
讲到这儿呢,很多小伙伴就会有一个疑问,我以后到底是用这个运行时异常还是用这个编译时异常?
其实从实际开发角度来看都是可以的。但是呢我给大家一个标准啊。
如果说你这个问题呢特别严重,程序员很容易犯。你想非常强烈的去提醒,你就应该抛一个编译时异常。那这样的好处是比如说程序员呢他不注意的话,他写完就会报错,就会强烈提醒他要检查。
如果你觉得这个问题呢不严重,你不想打扰程序员,程序员一般呢不会出现这个问题,那我就抛的运营是异常。