【Java学习笔记】自定义Java异常

简介: 作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.前言: 你的程序总有一天会崩溃掉,在崩溃掉的时候我们要知道它在哪,为了什么而崩溃掉,数据的保存或者丢失情况如何等问题。

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

1.前言:

你的程序总有一天会崩溃掉,在崩溃掉的时候我们要知道它在哪,为了什么而崩溃掉,数据的保存或者丢失情况如何等问题。我们可以通过继承类java.lang.Throwable的子类:Exception来设计我们自己的Java异常。Exception类用于描述程序能够捕获的异常,如ClassNotFoundException。要注意的是自定义异常类之间也可以有继承关系,同时也需要为自定义异常类设计构造方法,以方便构造自定义异常对象。

2.设计实例分析:
这是个比较完整的自定义异常类的设计,其实是比较模板化的东西。

package playground;
import java.io.*;

public class MyException extends Exception {
  private int id; // a unique id
  private String classname; // the name of the class
  private String method; // the name of the method
  private String message; // a detailed message
  private MyException previous =
   null; // the exception which was caught
  private String separator = "/n"; // line separator
  public MyException(int id, String classname, String method,
    String message, MyException previous) {
    this.id        = id;
    this.classname = classname;
    this.method    = method;
    this.message   = message;
    this.previous  = previous;
  } 
  public String traceBack() {
    return traceBack("/n");
  }

  public String traceBack(String sep) {
    this.separator = sep;
    int level = 0;
    MyException e = this;
    String text = line("Calling sequence (top to bottom)");
    while (e != null) {
      level++;
      text += line("--level " + level + "--------------------------------------");
      text += line("Class/Method: " + e.classname + "/" + e.method);
      text += line("Id          : " + e.id);
      text += line("Message     : " + e.message);
      e = e.previous;
    } 
    return text;
  }

  private String line(String s) {
    return s + separator;
  }

}

我们来一个个看看这些东西:
在这个继承了Exception类的自定义异常类中,我们定义了如下变量:
id:独立标示符,这个是用来进行标示类中什么地方出现了错误被捕捉到。
classname:捕捉到这个错误的类的名字。
method:捕捉到这个错误的方法的名字。
message:用来描述整个事件的情况。
previous:是MyException得一个实例,若在链表中它是第一个的话,那么它就是null。

我们再看看都定义了什么方法:
traceBack():产生一个包含在异常类中存储的数据的一个回溯。使用newline标示作为分隔符
traceBack(String sep):和上一个其实是相同的东西,使用的分隔符可以自己定义。
line(String s):traceBack使用的一个方法。

步骤一:先扔出第一个异常:
这有两种情况:
a.若程序判断异常的某个地方主动抛出异常,那么你就会主动抛出一个错误,例如:
throw new MyException(  1, "Person", "getSalary",
  "Trying to get a salary, but no person was specified",null);

b.在另一个异常出现时抛出该异常,例如:
catch (Exception e) {
  throw new MyException(4, "Person", "read", e.toString(), null);
}

要是某一个方法要抛出MyException异常,那么在方法定义的时候形式如下:
public void read() throws MyException . . .

步骤二:接着我们扔出来的异常,例如:
Person p = new Person();
p.setPersonId(id);
try {
  p.read();
  s += p.getSalary();

catch (MyException e) {
  throw new MyException(1, "Stats", "getAllSalaries",
    "Could not get salary for " + id, e);
}

我们的策略是这样的:将我们可能扔出异常的方法置于我们的监控之下(try{}),然后出了事情我们在处理区(catch{})把这个异常处理,至于处理的方式可以是当场处理,也可以处理不了交予其他地方处理(throw())。需要注意的是,我们看到最后一个参数e,我们要在每个新的异常处将这个异常加入到异常类的链表中。

步骤三:回溯异常
我们上边设计的这个异常最后得出的一个异常链如下:
Calling sequence (top to bottom)
--level 1--------------------------------------
Class/Method: SalaryServlet/doGet
Id : 7
Message : Trying to get the total salary for employees
--level 2--------------------------------------
Class/Method: Stats/getAllSalaries
Id : 1
Message : Could not get salary for Lincoln
--level 3--------------------------------------
Class/Method: Person/read
Id : 3
Message : java.sql.SQLException: [HANSEN]Invalid object name 'xEMPLOYEE'.
--level 4--------------------------------------
Class/Method: Person/read
Id : 999
Message : SQLException. State/error code: S0002/208

我们可以分析得知在这个场景上,一个servlet被触发了,它调用了getAllSalaries,然后又调用了read方法,在read方法中,出现了一个SQLException

3.总结:
自定义异常类给了我们自己喜欢的异常的出现,其他的也没什么。哈哈~

 

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/


               作者:gnuhpc
               出处:http://www.cnblogs.com/gnuhpc/
               除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


分享到:

目录
相关文章
|
1月前
|
Java 编译器 开发工具
Java基础学习笔记——idea篇
JDK由JRE(包含JVM和核心类库)和开发工具箱(如javac编译器和java运行工具)组成。Java项目结构包括Project、Module、Package和Class。IDEA快捷键包括:生成main方法(main psvm)、复制代码(Ctrl+D)、删除代码(Ctrl+Y/X)、格式化代码(Ctrl+Alt+L)、重命名(Shift+F6)等。
17 0
|
2月前
|
Java
java自定义Service的异常
java自定义Service的异常
16 0
|
12天前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
27 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
1天前
|
前端开发 Java 应用服务中间件
【异常解决】java程序连接MinIO报错The request signature we calculated does not match the signature you provided.
【异常解决】java程序连接MinIO报错The request signature we calculated does not match the signature you provided.
|
2天前
|
Java 关系型数据库 MySQL
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
|
2天前
|
Java 索引
【JAVA基础篇教学】第七篇:Java异常类型说明
【JAVA基础篇教学】第七篇:Java异常类型说明
|
4天前
|
存储 Java 开发者
探索Java开发中触发空指针异常的场景
作为一名后端开发者在Java编程的世界中,想必大家对空指针并不陌生,空指针异常是一种常见而又令人头疼的问题,它可能会在我们最不经意的时候突然出现,给我们的代码带来困扰,甚至导致系统的不稳定性,而且最可怕的是有时候不能及时定位到它的具体位置。针对这个问题,我们需要深入了解触发空指针异常的代码场景,并寻找有效的方法来识别和处理这些异常情况,而且我觉得空指针异常是每个Java开发者都可能面临的挑战,但只要我们深入了解它的触发场景,并采取适当的预防和处理措施,我们就能够更好地应对这个问题。那么本文就来分享一下实际开发中一些常见的触发空指针异常的代码场景,并分享如何有效地识别和处理这些异常情况。
19 1
探索Java开发中触发空指针异常的场景
|
6天前
|
SQL 网络协议 Java
Java异常详解
Java异常详解
8 1
|
15天前
|
Java 程序员 编译器
|
17天前
Swagger2异常:java.lang.NumberFormatException: For input string: ““
Swagger2异常:java.lang.NumberFormatException: For input string: ““
20 1