居然传递的值为Null

zhao9302 2008-07-10 12:31:39
这是一个计算器的程序 用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
}
}



...全文
200 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhao9302 2008-07-11
  • 打赏
  • 举报
回复
我知道了,我在后面有个地方没写 addActionListener 所以导致执行了那句话 。。。 还是谢谢哈
zhao9302 2008-07-10
  • 打赏
  • 举报
回复
没有修改哦。。new MainFrame(this);就是为了传进去
这是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;
}
ZangXT 2008-07-10
  • 打赏
  • 举报
回复
new MainFrame(this);
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);
ph215405357 2008-07-10
  • 打赏
  • 举报
回复
ding
zhao9302 2008-07-10
  • 打赏
  • 举报
回复
。??~
zhao9302 2008-07-10
  • 打赏
  • 举报
回复
恩恩 是啊。。我郁闷 但是getFrame()的程序我也贴出来了 没发现有什么问题啊
ZangXT 2008-07-10
  • 打赏
  • 举报
回复
public MainFrame(Control ct)
{
System.out.println(ct.s);
this.ct = ct;
System.out.println(ct.s);
getFrame();
System.out.println(ct.s);
}
我这样改了
输出结果是:
[]
[]
null
getFrame()之后s就为null了.
zhao9302 2008-07-10
  • 打赏
  • 举报
回复
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(); //是这句话 只是作为测试的时候加上的 其实这里如果我用的是 s.pop()或者s.push(1)之类的也是报错 同样的错误也就是说只要我 运行了new MainFrame(this)这句话就是这个样子。如果我不用这句话,我后面的是可以正常不报错的
}}
ZangXT 2008-07-10
  • 打赏
  • 举报
回复
at Control.programStart(Control.java:18)
看看这是哪句
zhao9302 2008-07-10
  • 打赏
  • 举报
回复
public MainFrame(Control ct)
{
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)
ZangXT 2008-07-10
  • 打赏
  • 举报
回复
你在进入和退出涉及到s的地方都输出一下s的信息,调试看看.
xuhaiyang 2008-07-10
  • 打赏
  • 举报
回复
把异常贴出来
zhao9302 2008-07-10
  • 打赏
  • 举报
回复
检查了一下,还是没有发现有什么错误啊。按钮如果不按的话是不会调用里面的方法的。貌似错误也就错在getFrame()里面 。。但程序中根本就没用过ct.s
ZangXT 2008-07-10
  • 打赏
  • 举报
回复
if(!ct.s.empty())
System.out.println(ct.s.pop());
这句是不是要判断s是否为空?
注意区别s.empty()
和s.isEmpty()
ZangXT 2008-07-10
  • 打赏
  • 举报
回复
在getFrame();
后面输出一下ct.s的信息。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧