运行此代码时:
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);
}
}
答案 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()
仍为""
。这就是你第一次得到例外的原因。按两次数字键,应该第二次工作。