Java异常学习之自定义异常详解

 更新时间:2017年06月21日 09:39:36   作者:AlanLee(Java)  
你的程序总有一天会崩溃掉,在崩溃掉的时候我们要知道它在哪,为了什么而崩溃掉,数据的保存或者丢失情况如何等问题。下面这篇文章主要给大家介绍了关于Java异常学习之自定义异常的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。

前言

哎呀,又出异常了!俗话说:“代码虐我千百遍,我待代码如初恋”。

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

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

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

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

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{ }

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

package com.czgo.exception;

/**
 * 自定义异常类(继承运行时异常)
 * @author AlanLee
 * @version 2016/11/26
 */
public class MyException extends RuntimeException {

 private static final long serialVersionUID = 1L;

 /**
  * 错误编码
  */
 private String errorCode;

 /**
  * 消息是否为属性文件中的Key
  */
 private boolean propertiesKey = true;

 /**
  * 构造一个基本异常.
  *
  * @param message
  *   信息描述
  */
 public MyException(String message)
 {
  super(message);
 }

 /**
  * 构造一个基本异常.
  *
  * @param errorCode
  *   错误编码
  * @param message
  *   信息描述
  */
 public MyException(String errorCode, String message)
 {
  this(errorCode, message, true);
 }

 /**
  * 构造一个基本异常.
  *
  * @param errorCode
  *   错误编码
  * @param message
  *   信息描述
  */
 public MyException(String errorCode, String message, Throwable cause)
 {
  this(errorCode, message, cause, true);
 }

 /**
  * 构造一个基本异常.
  *
  * @param errorCode
  *   错误编码
  * @param message
  *   信息描述
  * @param propertiesKey
  *   消息是否为属性文件中的Key
  */
 public MyException(String errorCode, String message, boolean propertiesKey)
 {
  super(message);
  this.setErrorCode(errorCode);
  this.setPropertiesKey(propertiesKey);
 }

 /**
  * 构造一个基本异常.
  *
  * @param errorCode
  *   错误编码
  * @param message
  *   信息描述
  */
 public MyException(String errorCode, String message, Throwable cause, boolean propertiesKey)
 {
  super(message, cause);
  this.setErrorCode(errorCode);
  this.setPropertiesKey(propertiesKey);
 }

 /**
  * 构造一个基本异常.
  *
  * @param message
  *   信息描述
  * @param cause
  *   根异常类(可以存入任何异常)
  */
 public MyException(String message, Throwable cause)
 {
  super(message, cause);
 }
 
 public String getErrorCode()
 {
  return errorCode;
 }

 public void setErrorCode(String errorCode)
 {
  this.errorCode = errorCode;
 }

 public boolean isPropertiesKey()
 {
  return propertiesKey;
 }

 public void setPropertiesKey(boolean propertiesKey)
 {
  this.propertiesKey = propertiesKey;
 }
 
}

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

package com.czgo.exception;

public class MyExceptionTest {

 public static void main(String[] args) {
  
   String[] sexs = {"男性","女性","中性"};
   for(int i = 0; i < sexs.length; i++){
    if("中性".equals(sexs[i])){
     throw new MyException("你!");
    }else{
     System.out.println(sexs[i]);
    }
   } 
 }
}

运行结果:

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

结束语

现在搞软件开发的人越来越多了,高手数不胜数,菜鸟也数不胜数,把这行的行情搅的比较混乱。所以初入这行的哥们一定要有危机意识。公司都想要工资开的不高,又能做一大把事情的人,搞开发很累,但是在当前的环境下,一定要不断的去提高自己。到了洗牌的时候,可能被淘汰的人里面就有你,除非你去做别的,不然就硬着头皮干几年把技术搞扎实,该复习的知识就多多复习,该学习的知识就多多学习,基础扎实了就去看看底层的东西,比如理解理解Java虚拟机,研究研究Spring源码。多关注关注前沿技术的发展,因为你现在所用的东西或许某一天大部分公司就不用了,或者根本满足不了项目的需求,这都是有可能的。希望大家都能混出自己的一片天地,小Alan现在也还在吃土中,所以大家都在一起前行,这世界终究是属于年轻人的,别气馁。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • 新手入门Jvm--Jvm垃圾回收

    新手入门Jvm--Jvm垃圾回收

    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的
    2021-06-06
  • JavaWeb实现文件上传功能详解

    JavaWeb实现文件上传功能详解

    这篇文章主要介绍了JavaWeb实现文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • SpringBoot2.X整合Spring-Cache缓存开发的实现

    SpringBoot2.X整合Spring-Cache缓存开发的实现

    本文主要介绍了SpringBoot2.X整合Spring-Cache缓存开发的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 浅谈java中集合的由来,以及集合和数组的区别详解

    浅谈java中集合的由来,以及集合和数组的区别详解

    下面小编就为大家带来一篇浅谈java中集合的由来,以及集合和数组的区别详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • 通过Java实现对PDF页面的详细设置

    通过Java实现对PDF页面的详细设置

    这篇文章主要介绍了通过Java实现对PDF页面的详细设置,下面的示例将介绍通过Java编程来对PDF页面进行个性化设置的方法,包括设置页面大小、页边距、纸张方向、页面旋转等,需要的朋友可以参考下
    2019-07-07
  • 如何使用MybatisPlus的SQL注入器提升批量插入性能

    如何使用MybatisPlus的SQL注入器提升批量插入性能

    本文给大家介绍如何使用MybatisPlus的SQL注入器提升批量插入性能,以实战视角讲述如何利用该特性提升MybatisPlus 的批量插入性能,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • SpringCloud基于RestTemplate微服务项目案例解析

    SpringCloud基于RestTemplate微服务项目案例解析

    这篇文章主要介绍了SpringCloud基于RestTemplate微服务项目案例,在写SpringCloud搭建微服务之前,先搭建一个不通过springcloud只通过SpringBoot和Mybatis进行模块之间通讯,通过一个案例给大家详细说明,需要的朋友可以参考下
    2022-05-05
  • 基于MyBatis的简单使用(推荐)

    基于MyBatis的简单使用(推荐)

    下面小编就为大家带来一篇基于MyBatis的简单使用(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • spring整合redis以及使用RedisTemplate的方法

    spring整合redis以及使用RedisTemplate的方法

    本篇文章主要介绍了spring整合redis以及使用RedisTemplate的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • 详解Java的TCP/IP编程学习--基于定界符的成帧

    详解Java的TCP/IP编程学习--基于定界符的成帧

    这篇文章主要介绍了Java的TCP/IP编程学习--基于定界符的成帧,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论