如何在JTextField中输入String而不是整数时创建Java异常?

时间:2017-01-19 10:25:16

标签: java windows jtextfield

如果在JTextField中写一个字符串而不是od整数,我遇到异常问题。我想在每次单击时将输入数字相加并在JButton上写入结果。每次我点击按钮,我都会收到错误: *

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.");
        }
    }

}

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

3 个答案:

答案 0 :(得分:0)

您必须检查null first ,然后抛出您自己的异常,例如!

目前,您的代码是:

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()时有没有点!

最后:避免那些没有任何说法变量的一个字符名称。使用名称后面的内容的名称!

答案 1 :(得分:0)

当您应该致电getSelectedText()时,您正在致电getText()getSelectedText()的文档说:

  

返回此TextComponent中包含的所选文本。如果选择为null或文档为空,则返回null

如果用户选择了JTextField中的全部或部分文字,则只会返回文字。要获取JTextField中输入的内容,请使用getText()

您的代码还有其他一些问题。您不应该创建文本字段public static,因为这样做本质上是创建全局变量。在这么短的课程中,它不会让你陷入困境,但随着课程的成长,你很快就会遇到麻烦。

相反,使它们private,为它们提供getter,实例化Ena的实例并将其传递给EnaP的构造函数,并调用getter来访问它们。这样,只有EnaP的实例创建为Ena实例中按钮的动作侦听器才能访问文本字段。

此外,正如GhostCat指出的那样,您的变量名称不会传达有关它们代表什么或它们将包含哪些值的任何信息。同样,这在一个非常小的程序中并不重要,但程序越大,它就变得越来越重要。

答案 2 :(得分:0)

GhostCat告诉你的一切都是正确的。

另一个问题是:Ena.a.getSelectedText()从输入字段返回所选(=突出显示的)文本。我确定那不是你想要的。

来自javadoc:

  

public String getSelectedText()
  返回包含在中的选定文本   这个TextComponent。
  如果选择为null或文档为空,   返回null。

     

返回:文本

     

抛出:IllegalArgumentException - 如果   对于某些人来说,选择没有有效的文档映射   原因

使用Ena.a.getText()代替