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秒的开销。