Java异常之自定义异常

简介:

俗话说:“代码虐我千百遍,我待代码如初恋”。

小Alan最近一直在忙着工作,已经很久没有写写东西来加深自己的理解了,今天来跟大家聊聊Java异常。Java异常的体系什么的,理论知识啥的我就懒得去BB太多了,是个搞Java开发的都知道,只是可能理解的不深,这个大家可以自己多看看资料,我就简单的说说。

什么是异常?

我不知道大家都是怎么去理解的,我的理解很简单,那就是不正常的情况,比如我现在是个男的,但是我却有着女人所独有的东西,在我看来这尼玛肯定是种异常,简直不能忍。就拿上面的异常图片来说,你应该是有小弟弟的,但你却没有小弟弟,这就是不正常的情况了,所以Java这个妹子会告诉你,你应该有小弟弟的才能办事,或者你没小弟弟就别来办事,你没小弟弟也要强上别人,那也没法玩啊是吧?

常说我们人的祖宗是猿,异常Exception的祖宗那就是Throwable类了,除了Exception类外,Throwable还有一个子类Error 。Error这玩意就不说了,你如果遇到了它你可以把电脑砸了,呼呼呼...跟大家开个玩笑,反正这玩意不是我们程序能处理的,它在程序处理的范畴之外。至于异常Exception又分为傻傻啥的,我就不BB了,再BB就B到这上面了。

给大家随便列举几个异常:

RuntimeException:你不能跑得足够快,可能因为你太胖了。关掉你的电脑,出门锻炼吧。

NullPointerException:你没有狗。请你先找一只狗,比如一只布烈塔尼獵犬,然后再试一次。

IndexOutOfBoundsException:你把食指放在了无法接收的地方,重新放置,再试一次。

FileNotFoundException:一名木匠应该总是知道他的工具放在哪里。

NotSerializableException:你正试图把一部电影改成电视剧。

这尼玛什么鬼?反正我是没看懂。还好今天我要理解的对象不是上面的这些玩意,搞错对象就不好了,看看就好了,但是别乱搞,男人都懂的,啧..啧..啧...。

 

自定义异常

今天我们要来理解的是什么是自定义异常,为什么要使用自定义异常,使用自定义异常有哪些好处,有哪些不好的地方?

要使用自定义异常就跟你和女朋友相处一样的,首先你得知道你为什么要跟你女朋友在一起,你女朋友有哪些好处,有哪些不好的地方,再来和你女朋友谈婚论嫁过一辈子,我们就先来说说这些问题,最后再来看怎么使用自定义异常,自定义异常的实现和使用非常简单,关键还是理解why的内容。

 

为什么要使用自定义异常,有什么好处?

1.我们在工作的时候,项目是分模块或者分功能开发的 ,基本不会你一个人开发一整个项目,使用自定义异常类就统一了对外异常展示的方式。

2.有时候我们遇到某些校验或者问题时,需要直接结束掉当前的请求,这时便可以通过抛出自定义异常来结束,如果你项目中使用了SpringMVC比较新的版本的话有控制器增强,可以通过@ControllerAdvice注解写一个控制器增强类来拦截自定义的异常并响应给前端相应的信息(关于springMVC控制器增强的知识有空再和大家分享)。

3.自定义异常可以在我们项目中某些特殊的业务逻辑时抛出异常,比如"中性".equals(sex),性别等于中性时我们要抛出异常,而Java是不会有这种异常的。系统中有些错误是符合Java语法的,但不符合我们项目的业务逻辑。

4.使用自定义异常继承相关的异常来抛出处理后的异常信息可以隐藏底层的异常,这样更安全,异常信息也更加的直观。自定义异常可以抛出我们自己想要抛出的信息,可以通过抛出的信息区分异常发生的位置,根据异常名我们就可以知道哪里有异常,根据异常提示信息进行程序修改。比如空指针异常NullPointException,我们可以抛出信息为“xxx为空”定位异常位置,而不用输出堆栈信息。

 

说完了为什么要使用自定义异常,有什么好处,我们再来看看自定义异常的毛病:

毋庸置疑,我们不可能期待JVM(Java虚拟机)自动抛出一个自定义异常,也不能够期待JVM会自动处理一个自定义异常。发现异常、抛出异常以及处理异常的工作必须靠编程人员在代码中利用异常处理机制自己完成。这样就相应的增加了一些开发成本和工作量,所以项目没必要的话,也不一定非得要用上自定义异常,要能够自己去权衡。

 

最后,我们来看看怎么使用自定义异常:

在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。

  • 所有异常都必须是 Throwable 的子类。

  • 如果希望写一个检查性异常类,则需要继承 Exception 类。

  • 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。

可以像下面这样定义自己的异常类:

class MyException extends Exception{ }

 

我们来看一个完整的实例:

复制代码

复制代码

  1 package com.czgo.exception;
  2 
  3 /**
  4  * 自定义异常类(继承运行时异常)
  5  * @author AlanLee
  6  * @version 2016/11/26
  7  */
  8 public class MyException extends RuntimeException {
  9 
 10     private static final long serialVersionUID = 1L;
 11 
 12     /**
 13      * 错误编码
 14      */
 15     private String errorCode;
 16 
 17     /**
 18      * 消息是否为属性文件中的Key
 19      */
 20     private boolean propertiesKey = true;
 21 
 22     /**
 23      * 构造一个基本异常.
 24      *
 25      * @param message
 26      *            信息描述
 27      */
 28     public MyException(String message)
 29     {
 30         super(message);
 31     }
 32 
 33     /**
 34      * 构造一个基本异常.
 35      *
 36      * @param errorCode
 37      *            错误编码
 38      * @param message
 39      *            信息描述
 40      */
 41     public MyException(String errorCode, String message)
 42     {
 43         this(errorCode, message, true);
 44     }
 45 
 46     /**
 47      * 构造一个基本异常.
 48      *
 49      * @param errorCode
 50      *            错误编码
 51      * @param message
 52      *            信息描述
 53      */
 54     public MyException(String errorCode, String message, Throwable cause)
 55     {
 56         this(errorCode, message, cause, true);
 57     }
 58 
 59     /**
 60      * 构造一个基本异常.
 61      *
 62      * @param errorCode
 63      *            错误编码
 64      * @param message
 65      *            信息描述
 66      * @param propertiesKey
 67      *            消息是否为属性文件中的Key
 68      */
 69     public MyException(String errorCode, String message, boolean propertiesKey)
 70     {
 71         super(message);
 72         this.setErrorCode(errorCode);
 73         this.setPropertiesKey(propertiesKey);
 74     }
 75 
 76     /**
 77      * 构造一个基本异常.
 78      *
 79      * @param errorCode
 80      *            错误编码
 81      * @param message
 82      *            信息描述
 83      */
 84     public MyException(String errorCode, String message, Throwable cause, boolean propertiesKey)
 85     {
 86         super(message, cause);
 87         this.setErrorCode(errorCode);
 88         this.setPropertiesKey(propertiesKey);
 89     }
 90 
 91     /**
 92      * 构造一个基本异常.
 93      *
 94      * @param message
 95      *            信息描述
 96      * @param cause
 97      *            根异常类(可以存入任何异常)
 98      */
 99     public MyException(String message, Throwable cause)
100     {
101         super(message, cause);
102     }
103     
104     public String getErrorCode()
105     {
106         return errorCode;
107     }
108 
109     public void setErrorCode(String errorCode)
110     {
111         this.errorCode = errorCode;
112     }
113 
114     public boolean isPropertiesKey()
115     {
116         return propertiesKey;
117     }
118 
119     public void setPropertiesKey(boolean propertiesKey)
120     {
121         this.propertiesKey = propertiesKey;
122     }
123     
124 }

复制代码

复制代码

使用自定义异常抛出异常信息:

复制代码

复制代码

 1 package com.czgo.exception;
 2 
 3 public class MyExceptionTest {
 4 
 5     public static void main(String[] args) {
 6         
 7          String[] sexs = {"男性","女性","中性"};
 8          for(int i = 0; i < sexs.length; i++){
 9              if("中性".equals(sexs[i])){
10                  throw new MyException("你全家都是中性!");
11              }else{
12                  System.out.println(sexs[i]);
13              }
14          } 
15     }
16 }

复制代码

复制代码

运行结果:

就是这么简单,我的话实现了很多构造函数,可以根据实际业务需求去抛出相应的自定义异常。

 本文转自  zddnd  51CTO博客,原文链接:http://blog.51cto.com/13013666/1939695


相关文章
|
3月前
|
XML 人工智能 Java
java通过自定义TraceId实现简单的链路追踪
本文介绍了如何在Spring Boot项目中通过SLF4J的MDC实现日志上下文traceId追踪。内容涵盖依赖配置、拦截器实现、网关与服务间调用的traceId传递、多线程环境下的上下文同步,以及logback日志格式配置。适用于小型微服务架构的链路追踪,便于排查复杂调用场景中的问题。
135 0
|
4月前
|
Java 程序员 数据库连接
我们详细地讲解一下 Java 异常及要如何处理
我是小假 期待与你的下一次相遇 ~
|
7月前
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
7月前
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
8月前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
514 14
|
8月前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
1375 5
|
10月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
292 34
|
11月前
|
Java API 调度
如何避免 Java 中的 TimeoutException 异常
在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
512 13
|
11月前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
320 1
|
11月前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
188 1

热门文章

最新文章