2012-03-15 57 views
0

我有一個空指針異常,我似乎無法找到解決方案。我一直在網上搜索幾個小時,但似乎找不到我的問題。Swing中的.getText()出錯,在java中獲得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 
{ 
    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); 
    } 
} 

該問題是特別是在它偵聽ButtonAddBalance和ButtonSetBalance的事件。它給出了NullPointerException,我發現沒有辦法修復。它應該從標籤「thebalance」中獲得文本,並將其解析爲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類在這裏(雖然我不認爲它需要這個錯誤?):

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())))); 
} 
+0

忽略ButtonSetBalance中的println,忘記取出它,檢查代碼是否正在執行並查找錯誤。 – nullwriter 2012-03-15 17:38:16

+0

請始終粘貼完整的錯誤逐字。否則,人們不得不猜測。 – paislee 2012-03-15 17:38:28

+0

你的'StockNums(boolean)'構造函數在哪裏?我的意思是整個班級:-) – 2012-03-15 17:39:36

回答

1

這裏的問題:newevent延伸MainPart(未必就我可以告訴)。這意味着thebalance裏面的newevent不是來自MainPartthebalance字段,而是來自newevent本身的thebalance字段,它永遠不會被初始化。

正如在評論中指出的那樣,該代碼還存在其他各種問題,但這就是導致您的NullPointerException。刪除extends MainPart,你應該可以繼續前進。

+0

+1,毫無疑問,代碼有這麼多的缺陷,這將是很難逐一解釋,直到和除非,OP不會面對面。通過書面交流,這很難解釋。 – 2012-03-15 19:39:29

+0

沒錯!爲此歡呼!我不知道我不必擴展MainPart來使用它的變量!我有另一個問題使用相同的代碼:爲什麼沒有在StockNums類的線程的run()方法改變MainPart的標籤?如果您取消註釋while循環中的註釋代碼,您將看到聲明! – nullwriter 2012-03-15 20:30:04

+0

我不知道'StockNums'類是做什麼的,我不能說。但是,值得了解的一件事是,如果要讀取或寫入Swing組件,則需要在事件派發線程中執行此操作。因此,如果您要修改標籤,則可能需要將'setText()'調用包裝到'Runnable'中,並使用'SwingUtilities.invokeLater()'調用它。請參閱http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html – 2012-03-15 21:12:03

相關問題