A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 明锦添 中级黑马   /  2013-3-18 22:50  /  1395 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

写代码时不是经常用到try --catch 吗,它用来捕捉异常,可是如何能自定义异常呢,请指点

6 个回复

正序浏览
黄玉昆 黑马帝 2013-3-19 07:43:22
7#
希望可以问一些有新意和有自己想法的问题,谢谢。如果问题解决了,请尽快将分类改为已解决。谢谢
回复 使用道具 举报
java如何自定义异常
这三方面的信息分别对应着三种消息的"接收者":
(1) 异常的类型--对于divide方法的调用者有特别重要的意义。调用divide方法的程序可以通过捕获特定类型的异常(如MyArithmeticException)而忽略其它类型异常。
(2) 发生异常的位置--对于程序员或客户技术支持来说有着特别重要的意义。他们需要通过stacktrace信息来分析错误或调试程序。
(3) 异常的信息--对于那些解释错误信息的用户来讲有着特别重要的意义。
如果在你的开发过程中遇到任何Java提供的异常类都不能描述的异常情况时,你可以创建自己的异常类:
通过继承Exception类或它的子类,实现自定义异常类;
对于自定义异常,必须采用throw语句抛出异常,这种类型的异常不会自行产生。
具体分为两步:
第1步 定义异常类。
class MyArithmeticException extends ArithmeticException{
     public MyArithmeticException(){
      public MyArithmeticException(String errorDescription){
     super(errorDescription);
}
    }
}
第2步 创建异常对象,并抛出该对象。。
public static int divide(int a,int b) throws MyArithmeticException{
     int result;
      if (b==0)
     throw new MyArithmeticException("divide by zero");
      else   result=a/b;
      return result;
}
public static void main(String args[ ]) {
     try{     divide(10,0);
     }catch(userException e) {
          e.printStackTrace();
     }     
}
当方法divide抛出MyArithmeticException异常时,它同时"抛出"了三方面的信息:
(1) 异常的类型,这里是MyArithmeticException。
(2) 发生异常的位置,可以通过异常的printStackTrace()方法得到。
(3) 异常的信息,在这里是通过指定errorDescription字符串("divide by zero")来表达的。
当程序抛出一个异常的时候,必须选择合适的异常类型,以便方法的调用者程序可以根据异常的类型来作出正确的处理;必须设置有意义的异常信息,以便看到异常或日志记录的用户能明白发生了什么事;必须让stacktrace反映出异常发生的最原始的位置信息。
       一个方法所声明抛出的异常,是设计该方法时必须考虑的重要因素。程序员应该站在方法调用者的立场去考虑这个问题,而不是站在书写这个方法的开发者的立场:
(1) 哪些异常是对调用者有意义的 ?调用者可以方便地捕获并处理这些异常。
(2) 哪些异常是调用者应当忽略的?调用者可以把这些异常传递给它们的调用者或用户。
在Java语言规范中,对于一个方法声明异常的数量没有一个硬性的指标,但通常声明较少的异常为好。
当程序员在一个方法中抛出一个异常,即书写一个throws句子时,对于每一个想抛出的异常,首先要考虑:
       (1)   方法的调用者接收到这个异常后,能够做些什么?
    (2) 方法的调用者是否能够区分异常的不同类型,从而做出不同的处理?
    如果考虑后的回答是否定的,那么书写该throws句子的程序员应在该方法中自行处理该异常,或者将它改为对调用者更为有意义的异常。
在设计方法的定义时,将相关的异常组织成对象树,只在方法中声明父类异常,这是保持throws子句稳定性的好方法。当需要增加一种异常时,只需从适当的父类中派生一个异常类即可。不需要修改方法的定义,因而也避免了修改所有该方法调用者的定义代码。
    将多个“低级异常”映射到少量“高级异常”的处理方法,还有一个显著的好处:它可以避免throws子句随着方法实现的改变而改变。
    在设计方法的初期,就声明这个方法抛出调用者所预期的异常,而不是在方法的实现阶段根据当前的实现方法来决定抛出何种异常。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
try--catch语句是在方法中抛出并捕获解决异常,谁调用谁就要处理这个异常。
自定义异常是新建立一个类,然后这个类继承Exception或者RuntimeException,这样自定义类就具备可抛性,并且具备操作异常的共性方法。
当要定义自定义异常的信息时可以使用父类已经定义好的功能,将异常异常信息传递给父类的构造函数。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
自定义异常有两种,分别是继承Exception和Throwable 类,因为Throwable是exception的父类,所以,继承Exception和继承Throwable效果差不多
一、第一种定义方式,继承Exception类

public class MyFirstException extends Exception {

public MyFirstException() {

super();

}

public MyFirstException(String msg) {

super(msg);

}

public MyFirstException(String msg, Throwable cause) {

super(msg, cause);

}

public MyFirstException(Throwable cause) {

super(cause);

}
第二种定义方式:继承Throwable 类

public class MySecondException extends Throwable {

public MySecondException() {

super();

}

public MySecondException(String msg) {

super(msg);

}

public MySecondException(String msg, Throwable cause) {

super(msg, cause);

}

public MySecondException(Throwable cause) {

super(cause);

}

}

//自定义异常类的主要作用是区分异常发生的位置,当用户遇到异常时,

//根据异常名就可以知道哪里有异常,根据异常提示信息进行修改。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
同学没看毕老师的视频吧,视频中对自定义异常讲解的很详细。
回复 使用道具 举报
自定义异常是按照java的面向对象思想,将程序中出现的特有问题进行封装。
必须是自定义类,继承Exception或者RuntimeException,因为父类中已经把异常信息的操作都完成了,所以子类只要在构造时,将异常信息传递给父类通过super语句,那么就可以直接通过getMessage方法获取自定义的异常信息。

评分

参与人数 1黑马币 +6 收起 理由
黄玉昆 + 6

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马