如何编写和应用Java的自定义异常类-阿里云开发者社区

开发者社区> 技术小甜> 正文

如何编写和应用Java的自定义异常类

简介:
+关注继续查看

11.7.1  编写自定义异常类的模式

编写自定义异常类实际上是继承一个API标准异常类,用新定义的异常处理信息覆盖原有信息的过程。常用的编写自定义异常类的模式如下:

 

public class CustomException extends Exception {    //或者继承任何标准异常类
    public CustomException()  {}                //用来创建无参数对象
    public CustomException(String message) {        //用来创建指定参数对象
        super(message);                             //调用超类构造器
    }
}

 

当然也可选用Throwable作为超类。其中无参数构造器为创建缺省参数对象提供了方便。第二个构造器将在创建这个异常对象时提供描述这个异常信息的字符串,通过调用超类构造器向上传递给超类,对超类中的toString()方法中返回的原有信息进行覆盖。
来讨论一个具体例子。假设程序中需要验证用户输入的表示年龄的数据必须是正整数值。我们可以按照以上模式编写这个自定义异常类如下:

 

public class NegativeAgeException extends Exception {
                                            //或者:extends Throwable
    public NegativeAgeException()  {}
    public NegativeAgeException(String message) {
        super(message);
    }
}

 

下面是应用这个自定义异常类的例子:

 

//完整程序存在本书配套资源目录为Ch11中名为NegativeAgeExceptionTest.java
...
try{
   String ageString = JOptionPane.showInputDialog("Enter your age: ");

 

   if (Integer.parseInt(ageString) < 0)
        throw new NegativeAgeException("Please enter a positive age");
   else
        JOptionPane.showMessageDialog(null, ageString, "Age", 1);
}
catch(NegativeAgeException e){
    System.out.println(e);
}
...

 

或者,可以创建一个缺省对象,然后在catch中打印具体信息,如:

 

    throw new NegativeAgeException();
    ...
catch (NegativeAgeException e) {
    System.out.println("Please enter a positive age");

 

 

将产生与第一个例子相同的效果。

11.7.2  自定义异常处理

无论是利用标准API异常类来处理特殊的异常,或者编写自定义的异常类来达到同样目的,问题的关键是:
1.         当这个异常发生时,如何及时捕获这个异常。
2.         捕获这个异常后,如何产生精确的异常处理信息。
       毋庸置疑,我们不可能期待JVM自动抛出一个自定义异常,也不能够期待JVM会自动处理一个自定义异常。发现异常、抛出异常以及处理异常的工作必须靠编程人员在代码中利用异常处理机制自己完成。
一般情况下,发现和抛出一个自定义异常通过在try程序块中利用ifthrow语句完成,即:

 

try {
    ...
    if (someExceptionConditon == true) {
        throw new CustomException("A custom exception xxx occurred. Please
        check your entry...")
    ...
    }
catch (CustomException e) {
    ...
}

 

而打印异常处理信息可以在抛出时包括在构造器的参数中,或者包括在处理这个异常的catch中。
另外应该注意在自定义异常发生之前,有可能产生标准异常的情况。例如,在一个需要验证年龄必须是正整数值的程序中,利用自定义异常类,如NegativeAgeException,验证输入的年龄是否正整数,即:

 

try {
    ...
    if (Integer.parseInt(ageString) < 0)     
        throw NegativeAgeException("Please enter a positive age");
    else
        ...
    }
    catch (NumberFormatException e) {
        System.out.println(e);
    }
    catch (NegativeAgeException e) {
        System.out.println(e);
    }
    ...

 

注意在这个代码中,如果ageString是非法整数字符串,如“25ab”,系统将首先抛出NumberFormatException,而不会执行throw NegativeAgeException("Please enter a positive age")。所以应该在catch中加入对NumberFormatException的处理,如以上代码所示。

 



















本文转自高永强51CTO博客,原文链接: 

http://blog.51cto.com/yqgao/174767,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Springboot自定义异常处理
1.自定义异常类 import lombok.Data; @Data public class UserException extends RuntimeException { private Long id; public UserException(Long id) { super("user not exist"); this.
1216 0
Java自定义注解
什么是注解: Annotation注解就Java提供了一种元程序中元素中的元素关联的任何信息和任何元数据(metadata)的途径和方法。 Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据。
988 0
Java常用类库--国际化程序
<h1>国际化程序:</h1> <div>国际化的操作就是指一个程序可以同时适应多门语言,即:如果现在程序的使用者是中国人,则会以中文为显示文字,如果现在程序的使用者是英国人,则会以英语为显示的文字,也就是说可以通过国际化操作,让一个程序适应各个国家的语言要求。那么,对于各个国家来说,每一个程序的代码是不会有任何变化的,但是只是其显示文字上有所差别。<br> </div> <div>国
1164 0
Java集合源码学习(五)几种常用集合类的比较
这篇笔记对几个常用的集合实现,从效率,线程安全和应用场景进行综合比较。 ArrayList、LinkedList与Vector的对比 (1)相同和不同 都实现了List接口,使用类似。 Vector和ArrayList的底层实现都是数组,这一点与LinkedList的双向链表不同。
2157 0
Java常用类库--StringBuffer:append、insert、reverse、replace、subString、delete、indexOf
<h1>1、认识StringBuffer</h1> <div> <img src="http://img.blog.csdn.net/20131018095308812" alt=""><br> </div> <h2>1.1字符串连接 操作append</h2> <div> <img src="http://img.blog.csdn.net/20131018095542687" a
1464 0
Java常用类库--Runtime类
<h1>1、认识Runtime类</h1> <div> <img src="http://img.blog.csdn.net/20131019090525000" alt=""><br> </div> <div> <img src="http://img.blog.csdn.net/20131019090603109" alt=""><br> </div> <div> <img sr
1093 0
+关注
10146
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载