swing中的.getText()出错,在java中获取NullPointerException
我有一个空指针异常,我似乎找不到解决方案。我在网上搜索了几个小时,但似乎找不到我的问题 问题是.getText()给了我null。现在,我找不到修复的方法。代码如下:swing中的.getText()出错,在java中获取NullPointerException,java,swing,nullpointerexception,Java,Swing,Nullpointerexception,我有一个空指针异常,我似乎找不到解决方案。我在网上搜索了几个小时,但似乎找不到我的问题 问题是.getText()给了我null。现在,我找不到修复的方法。代码如下: import javax.swing.JFrame; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.Random; public class MainPart extends JFrame { priv
import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Random;
public class MainPart extends JFrame
{
private String currentuser;
public JPanel north, center, south;
private JButton testone, buy, sell, ButtonSetBalance, ButtonAddBalance;
public JTextField nums, share, price, thebalance;
public JLabel result, mybalance, myshowbalance;
public double balance;
public MainPart()
{
}
public MainPart(String username)
{
currentuser = username;
GridBagConstraints c = new GridBagConstraints();
north = new JPanel(new GridBagLayout());
north.setBackground(Color.cyan);
north.setSize(300,300);
getContentPane().add(north, BorderLayout.SOUTH);
testone = new JButton("Start/Stop");
c.gridx = 0;
c.gridy = 0;
north.add(testone, c);
nums = new JTextField(10);
c.gridx = 1;
c.gridy = 0;
north.add(nums, c);
result = new JLabel("result");
c.gridx = 2;
c.gridy = 0;
north.add(result, c);
ButtonSetBalance = new JButton("Set Balance");
c.gridx = 0;
c.gridy = 1;
north.add(ButtonSetBalance, c);
ButtonAddBalance = new JButton("Add Balance");
c.gridx = 1;
c.gridy = 1;
north.add(ButtonAddBalance, c);
thebalance = new JTextField(10);
c.gridx = 2;
c.gridy = 1;
north.add(thebalance,c);
mybalance = new JLabel("Balance: ");
c.gridx = 0;
c.gridy = 2;
north.add(mybalance, c);
myshowbalance = new JLabel(Double.toString(balance));
c.gridx = 1;
c.gridy = 2;
north.add(myshowbalance,c);
System.out.println("The balance: " + thebalance.getText());
newevent e = new newevent();
testone.addActionListener(e);
ButtonAddBalance.addActionListener(e);
ButtonSetBalance.addActionListener(e);
}
public class newevent extends MainPart implements ActionListener
{
public boolean engine = false;
public Thread t;
MainPart action;
public void actionPerformed(ActionEvent evt)
{
if(evt.getSource() == testone)
{
//t = new Thread(new StockNums(true));
//t.start();
if(engine == false)
{
t = new Thread(new StockNums(true));
t.start();
System.out.println("Start");
engine = true;
}
else
{
t.interrupt();
System.out.println("Stop");
engine = false;
}
}
else if(evt.getSource() == ButtonSetBalance)
{
System.out.println("Inside set theres: ");
try
{
action = new MainPart();
action.setBalance(Double.parseDouble(thebalance.getText()));
}
catch(Exception e){System.out.println(e);}
}
else if(evt.getSource() == ButtonAddBalance)
{
try
{
action = new MainPart();
action.addBalance(Double.parseDouble(thebalance.getText()));
}
catch(Exception e){ System.out.println(e);}
}
}
}
public void setBalance(double bal)
{
balance = bal;
System.out.println("Balance = £" + balance);
}
public void addBalance(double bal)
{
balance += bal;
System.out.println("Added " + bal + " to balance. New balance = £");
}
public void setLabelText(String i)
{
result.setText(i);
}
}
问题具体出现在它侦听ButtonAndBalance和ButtonSetBalance的事件中。它给出了一个NullPointerException,我没有找到修复的方法。它应该从标签“thebalance”中获取文本,并将其解析为Double,然后根据具体情况,将其添加到balance或将其设置为balance全局Double变量。谢谢大家!
此处出现错误:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at MainPart$newevent.actionPerformed(MainPart.java:115)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
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:6373)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6138)
at java.awt.Container.processEvent(Container.java:2085)
at java.awt.Component.dispatchEventImpl(Component.java:4735)
at java.awt.Container.dispatchEventImpl(Container.java:2143)
at java.awt.Component.dispatchEvent(Component.java:4565)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4621)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4282)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4212)
at java.awt.Container.dispatchEventImpl(Container.java:2129)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4565)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:679)
at java.awt.EventQueue.access$000(EventQueue.java:85)
at java.awt.EventQueue$1.run(EventQueue.java:638)
at java.awt.EventQueue$1.run(EventQueue.java:636)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:652)
at java.awt.EventQueue$2.run(EventQueue.java:650)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:649)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
这里还有StockNums类(尽管我不认为这个错误需要它):
问题是:
newevent
扩展了MainPart
(据我所知,这是不必要的)。这意味着newevent
中的balance
不是封装的main部分的balance
字段,而是newevent
本身的balance
字段,它从不初始化
如注释中所述,此代码还存在其他各种问题,但这正是导致NullPointerException
的原因。删除extends MainPart
,您应该能够继续。忽略println in按钮,忘记取出,正在检查代码是否正在执行并定位错误。请始终逐字粘贴完整的错误。否则人们不得不猜测。你的StockNums(布尔)
构造函数在哪里?我是说全班:-)编辑了帖子并添加了!:对我来说,你的整个编码风格都是错误的。为什么要为controller
类扩展GUI
类,为什么不将这些东西放在给定的GUI
类中,而不是将它们放在一起。很多事情都是错误的,或者说方案写错了,大多数都不符合Java
为开发人员制定的标准。你知道吗?不要在GUI中使用Thread.sleep(…)
,这可能会导致应用程序闪烁或冻结。+1,毫无疑问,代码有太多缺陷,很难逐一解释,直到和除非OP无法面对面。书面交流太难解释了。是的,的确如此!!为此干杯!我不知道我不必扩展MainPart来使用它的变量!对于相同的代码,我还有一个问题:为什么StockNums类中线程的run()方法不更改MainPart的标签?如果在while循环中取消注释已注释代码,您将看到该语句!不知道StockNums类做什么,我真的不能说。然而,有一件事值得知道,如果要读取或写入Swing组件,则需要在事件分派线程中执行。因此,如果要修改标签,可能需要将setText()
调用包装在Runnable
中,并使用SwingUtilities.invokeLater()调用它。看见
import java.util.*;
public class StockNums extends MainPart implements Runnable
{
int num;
boolean active;
Random r = new Random();
MainPart n = new MainPart();
public StockNums(boolean get)
{
System.out.println("Inside StockNums");
active = get;
}
public void run()
{
try
{
while(active == true)
{
//result.setText(Double.toString(random(Integer.parseInt(nums.getText()))));
System.out.println(Double.toString(random(1000)));
Thread.sleep(1000); // One second refresh
}
}
catch(Exception e){}
}
public double random(int num)
{
Random number = new Random();
return number.nextInt(num);
}
//result.setText(Double.toString(random(Integer.parseInt(nums.getText()))));
}