这是一个计算器的程序 用swing写的框架 MainFrame.java
(代码太长 截取关键的)
...
public MainFrame(Control ct)
{
this.ct = ct;
getFrame();
}
...//其中一个按钮的代码,其他按钮代码类似
private JButton getBackSpaceButton()
{
if (BackSpaceButton == null)
{
BackSpaceButton = new JButton();
BackSpaceButton.setBounds(new Rectangle(22, 102, 112, 43));
BackSpaceButton.setText("BackSpace");
BackSpaceButton.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{
// TODO Auto-generated method stub
// System.out.println(ct.s.empty());
if(!ct.s.empty())
System.out.println(ct.s.pop());
}
});
}
return BackSpaceButton;
}
Control.java
//这个类用来控制整个计算器,其中有一个栈
import java.util.Stack;public class Control
{ public Stack<Object> s = null;
public static void main(String ag[])
{
Control ct = new Control();
ct.programStart();
}
public void programStart()
{
s = new Stack<Object>();
new MainFrame(this);
s.empty();
//这里 如果将new MainFrame(this)给不要的话 s.empty()不报NullPOINT错
//否则报错NULLPOINT;
//而且按BackSpace按钮也报错NULLPOINT
}
}
(代码太长 截取关键的)
...
public MainFrame(Control ct)
{
this.ct = ct;
getFrame();
}
...//其中一个按钮的代码,其他按钮代码类似
private JButton getBackSpaceButton()
{
if (BackSpaceButton == null)
{
BackSpaceButton = new JButton();
BackSpaceButton.setBounds(new Rectangle(22, 102, 112, 43));
BackSpaceButton.setText("BackSpace");
BackSpaceButton.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{
// TODO Auto-generated method stub
// System.out.println(ct.s.empty());
if(!ct.s.empty())
System.out.println(ct.s.pop());
}
});
}
return BackSpaceButton;
}
Control.java
//这个类用来控制整个计算器,其中有一个栈
import java.util.Stack;public class Control
{ public Stack<Object> s = null;
public static void main(String ag[])
{
Control ct = new Control();
ct.programStart();
}
public void programStart()
{
s = new Stack<Object>();
new MainFrame(this);
s.empty();
//这里 如果将new MainFrame(this)给不要的话 s.empty()不报NullPOINT错
//否则报错NULLPOINT;
//而且按BackSpace按钮也报错NULLPOINT
}
}
楼主【zhao9302】截止到2008-07-10 00:31:36的历史汇总数据(不包括此帖):
发帖的总数量:2 发帖的总分数:30 每贴平均分数:15
回帖的总数量:1 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:2 结贴的总分数:30
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:0.00 % 无满意结分率:0.00 %
敬礼!
this把当前的Control作为参数传了进去。我怀疑你getFrame里面对Control的成员s做了修改导致的问题。
这是getFrame()
private Frame getFrame()
{
if (Frame == null)
{
ShowLabel = new Label();
ShowLabel.setBounds(new Rectangle(29, 47, 354, 44));
ShowLabel.setText("");
ShowLabel.setAlignment(Label.RIGHT);
Frame = new Frame();
Frame.setLayout(null);
Frame.setSize(new Dimension(406, 409));
Frame.setTitle("计算器");
Frame.add(getBackSpaceButton(), null);
Frame.add(getMCButton(), null);
Frame.add(getMRButton(), null);
Frame.add(getMSButton(), null);
Frame.add(getMPlusButton(), null);
Frame.add(getOneButton(), null);
Frame.add(getTwoButton(), null);
Frame.add(getThreeButton(), null);
Frame.add(getFourButton(), null);
Frame.add(getFiveButton(), null);
Frame.add(getSixButton(), null);
Frame.add(getSevenButton(), null);
Frame.add(getEightButton(), null);
Frame.add(getNineButton(), null);
Frame.add(getZeroButton(), null);
Frame.add(getSignButton(), null);
Frame.add(getDotButton(), null);
Frame.add(getPlusButton(), null);
Frame.add(getMinusButton(), null);
Frame.add(getMultiplyButton(), null);
Frame.add(getDivideButton(), null);
Frame.add(getSqrtButton(), null);
Frame.add(getPercentButton(), null);
Frame.add(getReciproalButton(), null);
Frame.add(getEqualButton(), null);
Frame.add(getCEButton(), null);
Frame.add(getCButton(), null);
// Frame.add(getShowTextField(), null);
Frame.add(ShowLabel, null);
Frame.setVisible(true);
Frame.setResizable(false);
Frame.setLocation(450, 150);
Frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
return Frame;
}
后面输出一下ct.s的信息。
System.out.println(ct.s.pop());
这句是不是要判断s是否为空?
注意区别s.empty()
和s.isEmpty()
private Frame getFrame()
{
if (Frame == null)
{
ShowLabel = new Label();
ShowLabel.setBounds(new Rectangle(29, 47, 354, 44));
ShowLabel.setText("");
ShowLabel.setAlignment(Label.RIGHT);
{
System.out.println(ct.s);
this.ct = ct;
System.out.println(ct.s);
getFrame();
System.out.println(ct.s);
}
我这样改了
输出结果是:
[]
[]
null
Exception in thread "main" java.lang.NullPointerException
at Control.programStart(Control.java:18)
at Control.main(Control.java:11)如果我再按一个按钮BackSpace的话
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at MainFrame$2.actionPerformed(MainFrame.java:147)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6038)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5803)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
看看这是哪句
{ public Stack<Object> s = null;
public static void main(String ag[])
{
Control ct = new Control();
ct.programStart();
}
public void programStart()
{
s = new Stack<Object>();
new MainFrame(this);
s.empty(); //是这句话 只是作为测试的时候加上的 其实这里如果我用的是 s.pop()或者s.push(1)之类的也是报错 同样的错误也就是说只要我 运行了new MainFrame(this)这句话就是这个样子。如果我不用这句话,我后面的是可以正常不报错的
}}
{
System.out.println(ct.s);
this.ct = ct;
System.out.println(ct.s);
getFrame();
System.out.println(ct.s);
}
我这样改了
输出结果是:
[]
[]
null
getFrame()之后s就为null了.