2017-01-19 8 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()代替

相关问题