JAVA反编译出来的代码有时候并不能直接使用,问题经常会出现在内部类里.

      我们印度阿三老师布置了一个JAVA的ATM程序,大家偷懒找了个源程序打算反编译,然后改一下交了,可是反编译后我运行源代码.总是会出现这个错误
 
Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateException: current thread not owner
    at java.lang.Object.notify(Native Method)
    at simulation.BillsPanel$
1.actionPerformed(BillsPanel.java:36)
    at java.awt.TextField.processActionEvent(Unknown Source)
    at java.awt.TextField.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

        开始以为是反编译软件的问题,可是我试了JADDJ Java Decompiler等著名反编译软件还是不行,后来还是查了一下代码.
        发现BillsPanel这个类是这样写的.

class BillsPanel extends Panel
{

    
private TextField billsNumberField;

    BillsPanel()
    {
        billsNumberField 
= new TextField(30);
        billsNumberField.addActionListener(
new ActionListener() {

            
public void actionPerformed(ActionEvent actionevent)
            {
                
synchronized(BillsPanel.this)
                {
                    
                   notify();
                }
           
            }

        });
        Panel panel 
= new Panel();
        panel.add(billsNumberField);
        add(panel);
    }
    .
}

原来是 actionPerformed 出错了,那个nofity()通知的是自己,所以需要改为  BillsPanel.this.notify(); 线程才没有错.

    这么说来,反编译工具还不是很强大,也可能是java内部类机制比较复杂造成的..

推荐web开发者使用firefox浏览器调试网页,效率更高。下载地址: