java.lang.NumberFormatException:对于输入字符串:“”

时间:2010-09-13 14:49:13

标签: java jtextfield number-formatting

运行此代码时:

JTextField ansTxt;
...
ansTxt = new JTextField(5);
String aString = ansTxt.getText();
int aInt = Integer.parseInt(aString);

为什么我会收到此错误?

  

线程“AWT-EventQueue-0”中的异常java.lang.NumberFormatException:对于输入字符串:“”

更新:

JTextField ansTxt;
ansTxt = new JTextField(5);

ansTxt.addKeyListener(new KeyAdapter() {
   public void keyReleased(KeyEvent e) {
    ansTxt = (JTextField) e.getSource();
    String aString = ansTxt.getText().trim();
    int aInt = Integer.parseInt(aString);
   }
}

5 个答案:

答案 0 :(得分:3)

JTextField constructor的整数参数实际上是 width 的列数。来自文档:

  

public JTextField(int columns)

     

构造具有指定列数的新空TextField。创建默认模型,并将初始字符串设置为null。

构建它
ansTxt = new JTextField(5);

你基本上会得到一个空文本字段(稍微更宽比使用无参数构造函数构造它时)。如果你想让它包含字符串“5”你应该写

ansTxt = new JTextField("5");
更新: IIRC,你将获得一个keyDown事件,一个用于keyTyped,一个用于keyUp。据推测,文本字段尚未在keyDown事件上更新。 无论哪种方式,我建议你将Integer.parseInt封装在一个
try { ... } catch (NumberFormatException e) { ... }
阻止,因为用户可能很好地写一个整数以外的东西。 - >

答案 1 :(得分:2)

您正在尝试将空字符串解析为int,但这不起作用。应该将哪个int解析为? JTextField需要有一个可以解析的文本。

ansTxt.addKeyListener(new KeyAdapter() {
    public void keyReleased(KeyEvent e) {
        ansTxt = (JTextField) e.getSource();
        try {
            int aInt = Integer.parseInt(ansTxt.getText());
            //Do whatever you want with the int
        } catch(NumberFormatException nfe) {
            /*
             * handle the case where the textfield 
             * does not contain a number, e.g. show
             * a warning or change the background or 
             * whatever you see fit.
             */
        }
    }
}

在KeyAdapter中设置ansTxt可能也不是一个好主意。我建议你使用一个局部变量。这也使得将适配器移动到“真正的”类而不是匿名类更容易。

答案 2 :(得分:1)

使用方法trim()

int m=Integer.parseInt(txtfield.getText().trim());  

trim()方法将删除附加到该数字的任何字符串。

答案 3 :(得分:0)

尝试将Apache的“commons Lang”库引入您的项目,并为您的最后一行提供

int aInt = 0;
if(StringUtils.isNotBlank(aString) && StringUtils.isNumeric(aString) ){
    aInt = Integer.parseInt(aString);
}

编辑:不确定为什么要downvote。 JtextField将采用任何字符串。如果文本字段在每次按键时都在监听,则输入的每个非数字值(包括空白)都将生成NumberFormatException。在使用新值进行任何操作之前,最好检查它是否为数字。

edit2:根据Thomas的评论如下。我运行了一个测试来比较try / catch和StringUtils解决这个问题的方法。测试每次运行500万次。 try / catch的平均时间是21秒。 StringUtils的平均时间是8秒。因此,使用StringUtils进行重载非常快。如果代码上的负载很小,您会发现很少甚至没有区别。测试运行是

try{
   result = Integer.parseInt(num);
}catch(NumberFormatException ex){
   result = -1;
}

VS

if(StringUtils.isNotBlank(num) && StringUtils.isNumeric(num)){
   result = Integer.parseInt(num);
}else{
   result = -1;
}

每个循环生成一个10位数的新随机字符串,以避免在if语句的循环中进行任何优化。这增加了6-7秒的开销。

答案 4 :(得分:0)

您的KeyAdapter将在ansText处理KeyEvent之前运行。实际上,您可以e.consume()阻止ansText完全处理它。因此,第一次按下并释放按键时,ansText.getText()仍为""。这就是你第一次得到例外的原因。按两次数字键,应该第二次工作。