编写自定义异常类实际上是继承一个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异常类来处理特殊的异常,或者编写自定义的异常类来达到同样目的,问题的关键是:!--[if !supportLists]--1.span times="" new="" roman';="" font-size-adjust:="" none;="" font-stretch:="" normal;="" x-system-font:="" none"="" style="padding: 0px" !--[endif]--当这个异常发生时,如何及时捕获这个异常。!--[if !supportLists]--2.span times="" new="" roman';="" font-size-adjust:="" none;="" font-stretch:="" normal;="" x-system-font:="" none"="" style="padding: 0px" !--[endif]--捕获这个异常后,如何产生精确的异常处理信息。 毋庸置疑,我们不可能期待JVM自动抛出一个自定义异常,也不能够期待JVM会自动处理一个自定义异常。发现异常、抛出异常以及处理异常的工作必须靠编程人员在代码中利用异常处理机制自己完成。一般情况下,发现和抛出一个自定义异常通过在try程序块中利用if和throw语句完成,即: 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的处理,如以上代码所示。
本文出自 “海外咖啡豆 - 高永强的博客天地” 博客
分类: 电脑/网络 程序设计 其他编程语言
问题描述:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
自定义异常类
class NumException extends Exception{
public String toString(){
return "输入的值太小";
}
public String shuru(){
return "请输入数字";
}
}
class jisuanqi extends JFrame implements ActionListener,ItemListener{
JRadioButton rz;
JRadioButton rm;
ButtonGroup bg;
JTextField txt;
JButton btnj;
String msg;
jisuanqi(){
super("计算器");
rz=new JRadioButton("周长");
rm=new JRadioButton("面积");
bg=new ButtonGroup();
txt=new JTextField();
btnj=new JButton("计算");
msg="";
this.getContentPane().setLayout(new GridLayout(2,2));
bg.add(rz);
bg.add(rm);
this.getContentPane().add(rz);
this.getContentPane().add(rm);
this.getContentPane().add(txt);
this.getContentPane().add(btnj);
this.setSize(200,200);
rz.addItemListener(this);
rm.addItemListener(this);
btnj.addActionListener(this);
}
实现接口
public void actionPerformed(ActionEvent e) throws NumException{声明异常
if (Double.parseDouble(txt.getText())=0){
throw new NumException();抛出异常
}
if (msg.equals("周长")){
txt.setText(""+(3.14*2*Double.parseDouble(txt.getText())));
}
if (msg.equals("面积")){
txt.setText(""+3.14*(Double.parseDouble(txt.getText())*Double.parseDouble(txt.getText())));
}
}
实现接口
public void itemStateChanged(ItemEvent e){
if (e.getSource()==rz){
msg="周长";
}
if (e.getSource()==rm){
msg="面积";
}
}
public static void main(String args[]){
try{
jisuanqi js=new jisuanqi();
js.setVisible(true);
}
catch(NumException ex){
System.out.println(ex);
}
}
}
编译时出现:
C:\Documents and Settings\Administrator\桌面\新建文件夹\jisaunqi.java:45: jisuanqi 中的 actionPerformed(java.awt.event.ActionEvent) 无法实现 java.awt.event.ActionListener 中的 actionPerformed(java.awt.event.ActionEvent);被覆盖的方法不抛出 NumException
解析:
这段代码有问题:
实现接口
public void actionPerformed(ActionEvent e) throws NumException{声明异常
public void actionPerformed(ActionEvent e)不应该抛出异常, ActionListener接口函数没有异常抛出
一种可能的解决方法是把判断移到另外一个函数中,然后抛出异常,在actionPerformed中捕获或者在外面捕获
1 程序中的异常指不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程。Java通 过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件。当条件生成时,错误将引发异常。
Java异常类层次结构图:
使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可。
在程序中使用自定义异常类,大体可分为以下几个步骤。
(1)创建自定义异常类。
(2)在方法中通过throw关键字抛出异常对象。
(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
(4)在出现异常方法的调用者中捕获并处理异常。
创建自定义异常类
public class MyException extends Exception {
private static final long serialVersionUID = 1L;
public MyException(){
super();
}
public MyException(String msg){
super(msg);
}
}
使用的话就不演示了 如果你已经研究到了自定义异常 那么我相信你也一定会使用了
如果不会使用 建议学会使用后再来看这篇文章
class
MyException
extends
Exception
//自定义的异常类
继承Exception类
{
private
String
exceptionName;
//定义一个私有变量,用来为自定义异常
public
MyException(){}
//创建一个无参数的构造函数
public
MyException(String
exceptionName){
//创建一个有参数的构造函数,传入的参数为前面定义的异常名称
this.exceptionName=exceptionName;
}
public
String
getExceptionName(){
//定义一个方法,提供给外部来获取私有变量
return
this.exceptionName;
}
public
static
void
main(String
[]
args){
try{
System.out.println("自定义的异常类对象");
throw
new
MyException("自定义的异常");//抛一个自定义的异常类对象,传入的参数就是给控制台看的异常
}catch(MyException
e){
System.out.println("异常信息:"+e.getExceptionName());
}
}
}
我已经尽力你……你懂的!