问题描述:
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中捕获或者在外面捕获
抛出异常分为两种吧,一种是制造异常,一种是抛出可能发生的异常throw关键字,抛出一个异常(即制造一个异常),用法 throw 异常 ,该异常必须为java.lang.Exception的子类,如果是RuntimeException子类的话,则不需要捕获或抛出异常。
throws关键字,抛出一个可能发生的异常,用在函数定义中,末尾处,以主函数为例子,public static void main(String[] args) throws 异常 该异常必须为Exception子类,常用于其子类,是这一个方法体执行中可能抛出(throw)的异常处理。如果不进行throws,也可以用try...catch语句进行捕获。
自定义异常,类一定(间接)继承java.lang.Exception类,当然,继承java.lang.RuntimeException就可以不用进行处理,下面举一个例子:
public class TestException extends Exception {
public TestException(String message) {
super(message)
}
public TestException() {}
}
一般自定义异常需要有2个构造函数,五参构造器和String类型构造器,有参构造调用父类有参构造。