2017-01-19 11 views
0

如果您在JTextField中寫入字符串而不是od整數,則在生成異常時遇到問題。我想總結輸入數字並將結果寫在JButton上,每次點擊它。我每次點擊按鈕時,我得到EN錯誤: *如何在JTextField中輸入字符串而不是整數時創建Java異常?

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at EnaP.actionPerformed(EnaP.java:12) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)... 

*

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class Ena { 
    public static JTextField a; 
    public static JTextField b; 

    public static void main(String[] args) { 
     JFrame okno = new JFrame(); 
     okno.setSize(400, 200); 

     a = new JTextField("Number1"); 
     b = new JTextField("Number2"); 

     JButton gumb = new JButton("SUM"); 
     gumb.setPreferredSize(new Dimension(200,200)); 
     EnaP poslusalec = new EnaP(); 
     gumb.addActionListener(poslusalec); 

     JPanel p = new JPanel(); 
     p.add(a); 
     p.add(b); 
     okno.add(gumb, BorderLayout.EAST); 
     okno.add(p, BorderLayout.WEST); 
     okno.setTitle("Sum"); 

     okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     okno.setVisible(true); 

    } 

} 

和其他類 - 監聽器:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 

public class EnaP implements ActionListener{ 

    public void actionPerformed(ActionEvent e) { 
     JButton gumb = (JButton) e.getSource(); 

     try{ 
      String a = Ena.a.getSelectedText().toString(); 
      String b = Ena.b.getSelectedText().toString(); 
      int x = Integer.parseInt(a); 
      int y = Integer.parseInt(b); 
      int sum = x+y; 
      gumb.setText(""+sum); 
     } 
     catch (NumberFormatException n) { 
      System.out.println("Please enter a number."); 
     } 
    } 

} 

我不知道如何修復它...

+0

的[?什麼是空指針異常,以及如何解決呢(可能的複製http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

+0

你應該像這樣使用'instanceof':'if(e.getSource()instanceof JButton)''否則拋出異常 – specializt

回答

0

你必須檢查爲空第一個,然後拋出你自己的例外!

目前,你的代碼有云:

String a = Ena.a.getSelectedText().toString(); 

而事實上,你已經嘗試調用toString()對結果的getSelectedText()導致該NPE。

你想:

String fieldAsString = Ena.a.getSelectedText(); 
if (fieldAsString != null) {  
    try { 
    int x = Integer.parseInt(fieldAsString); 
    ... 

,而不是!

請注意:getSelectedText()已經退回字符串。有沒有點在該String對象上調用toString()

最後:避免那些不知道變量的一個字符名稱。使用名稱,說什麼名稱背後的東西是關於!

0

當您應該致電getText()時,您正在致電getSelectedText()。爲getSelectedText()文檔說:

Returns the selected text contained in this TextComponent . If the selection is null or the document empty, returns null .

如果用戶已選定文本的全部或部分在JTextField這隻會返回文本。要獲取JTextField中輸入的內容,請使用getText()

您的代碼還有其他一些問題。您不應該使文本字段public static這樣做基本上是創建全局變量。它不會讓你在這麼短的程序中遇到麻煩,但隨着程序的增長,你很快就會遇到麻煩。

取而代之,使它們爲private,爲它們提供getter,實例化Ena的一個實例並將它傳遞給EnaP的構造函數,然後調用getter來訪問它們。這樣,只有EnaP的實例被創建爲Ena實例中按鈕的動作偵聽器,才能訪問文本字段。另外,正如GhostCat指出的那樣,你的變量名稱並沒有傳達任何關於它們代表什麼或者它們將包含什麼值的信息。再次,這在一個非常小的程序中並不重要,但是程序變得越大,它越變得越重要。

0

GhostCat告訴你的是完全正確的。

另一個問題是:Ena.a.getSelectedText()從輸入字段返回所選(=突出顯示)的文本。我確定那不是你想要的。

根據JavaDoc:

public String getSelectedText()
Returns the selected text contained in this TextComponent.
If the selection is null or the document empty, returns null.

Returns: the text

Throws: IllegalArgumentException - if the selection doesn't have a valid mapping into the document for some reason

使用Ena.a.getText()代替

相關問題