java自定义异常抛出

Python031

java自定义异常抛出,第1张

分类: 电脑/网络 >>程序设计 >>其他编程语言

问题描述:

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中捕获或者在外面捕获

MyEventTest java:

package wintys event

import javax swing event EventListenerList

import java util Date

import java text DateFormat

import java text SimpleDateFormat

/**

* Java的事件机制/自定义事件

运行结果:

do something interesting in source here

listener detects [event]:wintys event MyEvent[source=wintys event MySource@

] [occur at]: : :

listener detects [event]:wintys event MyEvent[source=wintys event MySource@

] [occur at]: : :

* @version

* @author 天堂露珠 ()

* @see

*/

class MyEventTest{

public static void main(String[] args){

MySource source = new MySource()

MyListener myListener = new MyListener(){

public void doMyAction(MyEvent e){

System out println( listener detects + e)

}

}

source addMyListener(myListener)

source addMyListener(myListener)

source addMyListener(myListener)

source removeMyListener(myListener)

source doSomething()

}

}

/**

* 自定义的事件

* @version

* @author 天堂露珠()

* @see

*/

class MyEvent extends java util EventObject{

private Date date//记录事件发生的时间

public MyEvent(Object source Date date){

super(source)

this date = date

}

public String toString(){

DateFormat df = new SimpleDateFormat( yyyy MM dd HH:mm:ss )

String dt = df format(date)

return [event]: + super toString() + [occur at]: + dt

}

}

/**

* 自定义事件监听器接口

* @version

* @author 天堂露珠()

* @see

*/

interface MyListener extends java util EventListener{

void doMyAction(MyEvent e)

}

/**

* 自定义事件源

* @version

* @author 天堂露珠()

* @see

*/

class MySource{

/**

* 保存注册的监听器列表

* 子类可以使用它保存自己的事件监听器(非MyListener监听器)列表

*/

protected EventListenerList listenerList = new EventListenerList()

private MyEvent myEvent = null//fireDoMyAction()使用此变量

/**

* 没有做任何事

*/

public MySource(){

}

/**

* 添加一个MyListener监听器

*/

public void addMyListener(MyListener listener){

listenerList add(MyListener class listener)

}

/**

* 移除一个已注册的MyListener监听器

* 如果监听器列表中已有相同的监听器listener listener

* 并且listener ==listener

* 那么只移除最近注册的一个监听器

*/

public void removeMyListener(MyListener listener){

listenerList remove(MyListener class listener)

}

/**

* @return 在此对象上监听的所有MyListener类型的监听器

*/

public MyListener[] getMyListeners(){

return (MyListener[])listenerList getListeners(MyListener class)

}

//Winty:Copy directly from javax swing event EventListenerList

/*Notify all listeners that have registered interest for

notification on this event type The event instance

is lazily created using the parameters passed into

the fire method

*/

protected void fireDoMyAction() {

// getListenerList() Guaranteed to return a non null array

Object[] listeners = listenerList getListenerList()

// Process the listeners last to first notifying

// those that are interested in this event

for (int i = listeners length i>= i = ) {

if (listeners[i]==MyListener class) {

// Lazily create the event:

if (myEvent == null)

myEvent = new MyEvent(this new Date())

((MyListener)listeners[i+ ]) doMyAction(myEvent)

}

}

}

/**

* 做一些事件源应该做的有意义的事 然后通知监听器

* 这里只是一个示例方法

* 例如:MySource如果是一个按钮 则doSomething()就可以命名为click()

* 当用户点击按钮时调用click()方法

*/

public void doSomething() {

System out println( do something interesting here )

fireDoMyAction()//通知监听器

}

}

lishixinzhi/Article/program/Java/hx/201311/26237