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

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

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现在也还在吃土中,所以大家都在一起前行,这世界终究是属于年轻人的,别气馁。

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

(0)

相关推荐

  • Java自定义异常类的实例详解

    Java自定义异常类的实例详解 为什么要自己编写异常类?假如jdk里面没有提供的异常,我们就要自己写.我们常用的类ArithmeticException,NullPointerException,NegativeArraySizeException,ArrayIndexoutofBoundsException,SecurityException这些类,都是继续着RuntimeException这个父类,而这个父类还有一个父类是Exception.那么我们自己写异常类的时候,也是继续Excepti

  • java 抛出异常处理的方法

    java 抛出异常处理的方法 为了避免调用的人不知道有异常,才抛出异常的,所以是谁掉用的久在哪里处理.说的对吗 对. 1.throws关键字通常被应用在声明方法时,用来指定可能抛出的异常.多个异常可以使用逗号隔开.当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象. 如下面例子所示: public class Shoot { 创建类 static void pop() throws NegativeArraySizeException { //定义方法并抛出NegativeArr

  • java中排序报:Comparison method violates its general contract异常的解决

    前言 上周线上的一段排序的java代码出现了一个Comparison method violates its general contract,在解决这个问题的途中学到了一些知识这里总结分享一下. 异常原因 这个排序导致的异常将会在java7以上的版本出现,所以如果你的JDK从6升级到了7或者8,那一定要小心此异常. 在java7的兼容列表中,就有对此排序不兼容的说明: Area: API: Utilities Synopsis: Updated sort behavior for Arrays

  • Java中异常打印输出的常见方法总结

    前言 Java异常是在Java应用中的警报器,在出现异常的情况下,可以帮助我们程序猿们快速定位问题的类型以及位置.但是一般在我们的项目中,由于经验阅历等多方面的原因,依然有若干的童鞋在代码中没有正确的使用异常打印方法,导致在项目的后台日志中,没有收到日志或者日志信息不完整等情况的发生,这些都给项目埋下了若干隐患.本文将深入分析在异常日志打印过程中的若干情况,并给出若干的使用建议. 1. Java异常Exception的结构分析 我们通常所说的Exception主要是继承于Throwable而来,

  • Java异常退出条件的判断示例代码

    无论是功能性代码还是算法性代码,程序都是一系列流程的合集 既然是流程就分为:一般流程和异常流程: 一般流程保证了基本功能: 异常流程则是对程序稳定性的保证,不能因为一些非法输入,项目就挂了: 注意,布尔表达式的先后顺序,有时不可以交换 if (null == instance || instance.isEmpty()) 0. 常见异常退出条件 参数为空: 表示长度,表示索引的整型为负数,或者超出待索引数组或容器的范围: 1. String 的 startsWith 函数 首先来看 String

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

    前言 哎呀,妈呀,又出异常了!俗话说:"代码虐我千百遍,我待代码如初恋". 小Alan最近一直在忙着工作,已经很久没有写写东西来加深自己的理解了,今天来跟大家聊聊Java异常.Java异常的体系什么的,理论知识啥的我就懒得去BB太多了,是个搞Java开发的都知道,只是可能理解的不深,这个大家可以自己多看看资料,我就简单的说说. 什么是异常? 我不知道大家都是怎么去理解的,我的理解很简单,那就是不正常的情况,比如我现在是个男的,但是我却有着女人所独有的东西,在我看来这尼玛肯定是种异常,简

  • Python学习之自定义异常详解

    目录 自定义抛出异常关键字-raise 演示小案例-1 演示小案例-2 自定义异常类 总结 在上一章我们学习了 异常的三个关键字,分别是try.except 以及 finally.我们知道在 try 代码块中如果遇到错误就会抛出异常,交给 except 提前定义好的错误类型进行匹配并捕获,如果成功捕获到异常就会交给 except 的代码块进行执行,最后的 finally 是无论如何都会执行的代码块. 那么在 try 语法块中是谁抛出的异常?优势如何抛出的呢?首先抛出异常的是 Python 的解释

  • Java Spring5学习之JdbcTemplate详解

    一.JdbcTemplate Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作 二.实战 2.1 引入依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.24</version> </dependency> <!-

  • Java基础学习之构造方法详解

    目录 一.构造方法概述 二.构造方法的注意事项 三.标准类制作 一.构造方法概述 构造方法是一种特殊的方法 作用:创建对象Student stu = new Student(); 格式: pucli class 类名{        修饰符 类名(参数){        } } 功能:主要是完成对象数据的初始化 示例代码: class Student { private String name; private int age; //构造方法 public Student() { System.

  • Java基础学习之接口详解

    目录 概述 定义格式 含有抽象方法 含有默认方法和静态方法 含有私有方法和私有静态方法 基本的实现 实现的概述 抽象方法的使用 默认方法的使用 静态方法的使用 私有方法的使用 接口的多实现 抽象方法 默认方法 静态方法 优先级的问题 接口的多继承 其他成员特点 概述 接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量.构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8),私有方法 (JDK 9). 接

  • java异常(Exception)处理机制详解

    一. 异常的定义 在<Java编程思想>中这样定义 异常:阻止当前方法或作用域继续执行的问题.虽然java中有异常处理机制,但是要明确一点,决不应该用"正常"的态度来看待异常.绝对一点说异常就是某种意义上的错误,就是问题,它可能会导致程序失败.之所以java要提出异常处理机制,就是要告诉开发人员,你的程序出现了不正常的情况,请注意. 记得当初学习java的时候,异常总是搞不太清楚,不知道这个异常是什么意思,为什么会有这个机制?但是随着知识的积累逐渐也对异常有一点感觉了.举一

  • java异常:异常处理--try-catch结构详解

    目录 总结 从键盘接收两个整数,输出两数的商: package java_exception; import java.util.Scanner; public class TryDemoOne { public static void main(String[] args) { //定义两个整数,键盘输入两个整数,输出两数之商 Scanner input = new Scanner(System.in); System.out.println("=====运算开始====="); S

  • Java进阶学习:jar打包详解

    文章来源:pconline 作者:fivesky jar文件听说过吗,没有?或者陌生!好,没关系,这就是我们的第一站:打包发布. 为什么会有这个玩意呢,首先,这是jar的全称:JavaTM Archive (JAR) file,是的,就是java存档文件.这有点类似zip文件,想一想它是干什么的用的呢,压缩!?没错就是要压缩,将我们原先零散的东西放到一下,重新组织,所有这些目的只有一个:方便!好了,不用管他是怎么压缩的,我们的重点是哪些是我们要压缩的(输入),还有压缩成了什么(输出),进而将它发

  • Java中自定义异常详解及实例代码

    Java中自定义异常详解及实例代码 下面做了归纳总结,欢迎批评指正 自定义异常 class ChushulingException extends Exception { public ChushulingException(String msg) { super(msg); } } class ChushufuException extends Exception { public ChushufuException(String msg) { super(msg); } } 自定义异常 En

  • Java中内存异常StackOverflowError与OutOfMemoryError详解

     Java中内存异常StackOverflowError与OutOfMemoryError详解 使用Java开发,经常回遇到内存异常的情况,而StackOverflowError和OutOfMemoryError便是最常遇见的错误. 首先,看看这两种错误的解释: 如果当前线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常. 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常. 这里把异常分为两种情况,但是存在一些相互重

随机推荐