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

运行此代码时:

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

为什么我会收到此错误?

线程“AWT-EventQueue-0”中的exceptionjava.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); } } 

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

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) { ... } 

阻止,因为用户可能很好地写一个整数以外的东西。 – >

您正在尝试将空字符串解析为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, eg show * a warning or change the background or * whatever you see fit. */ } } } 

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

使用方法trim()

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

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

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

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

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

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

编辑2:根据托马斯的评论如下。 我运行了一个测试来比较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秒的开销。