问题描述:
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抛出自定义异常
1、定义一个自定义异常类
public class CustomException extends Exception { //或者继承任何标准异常类public CustomException() {} //用来创建无参数对象
public CustomException(String message) { //用来创建指定参数对象
super(message) //调用超类构造器
}
}
2、抛出异常
try{//执行语句
}catch(Exception ex){
throw new CustomException("自定义异常")//在catch中抛出自定义异常
}
首先自定义一个异常类public class ActionException extends Exception{
public String returnMessage
public ActionException(String returnMessage){
this.returnMessage = returnMessage
}
public String getReturnMessage(){
return this.returnMessage
}
代码中如果用到这个自定义的异常类,这里的代码只是做了个演示
private void validate(int a,int b)throws ActionException{
if(a>b){
throw new ActionException("a >b")
}
if(a<b){
throw new ActionException("a <b")
}
}
业务逻辑代码中
public String process(){
try{
validate(a,b)
}catch(ActionException ae){
System.out.println(ae.getReturnMessage())
}
}