3

运行此代码时:

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);
   }
}
4

5 回答 5

3

JTextField 构造函数的整数参数实际上是列数的宽度。从文档:

public JTextField(int columns)

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

通过构建它

ansTxt = new JTextField(5);

你基本上会得到一个空的文本字段(比你使用无参数构造函数构造它略宽)。如果你希望它包含字符串“5”,你应该写

ansTxt = new JTextField("5");
更新:IIRC,您将获得一个 keyDown 事件、一个 keyTyped 事件和一个 keyUp 事件。大概文本字段尚未在 keyDown 事件上更新。无论哪种方式,我建议您将 Integer.parseInt 封装在
try { ... } catch (NumberFormatException e) { ... }
块,因为用户很可能会写除整数以外的其他内容。-->
于 2010-09-13T14:52:01.250 回答
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 也可能不是一个好主意。我建议您为此使用局部变量。这也使得将适配器移动到“真实”类而不是匿名类更容易。

于 2010-09-13T14:50:51.343 回答
1

使用方法trim()

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

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

于 2011-02-22T14:45:29.117 回答
0

在您将处理 KeyEventKeyAdapter之前运行您的遗嘱。ansText事实上,您可以e.consume()完全阻止ansText处理它。所以第一次按下并释放一个键时,ansText.getText()仍然是"". 这就是你第一次得到异常的原因。按数字键两次,第二次应该工作。

于 2010-09-13T17:17:56.280 回答
0

尝试将 Apache 的“ commons Lang ”库引入您的项目,最后一行您可以这样做

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

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

编辑2:根据下面托马斯的评论。我运行了一个测试来比较 try/catch 与 StringUtils 解决此问题的方法。每个测试运行 500 万次。try/catch 的平均时间为 21 秒。StringUtils 的平均时间为 8 秒。因此,使用 StringUtils 处理重负载要快得多。如果代码上的负载很小,您会注意到几乎没有差异。测试运行是

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

对比

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

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

于 2010-09-13T14:59:35.853 回答