java和编程方面的新手。
写了这个递归方法,目的是要求一个既是整数又大于0的有效字符串:
private int getDimension(String tableElement){
Integer Input= 0;
System.out.println("Define table rows "+tableElement+"'s."
+"Enter an integer >= 1:");
if( !Reader.hasNextInt() || (Input=Input.parseInt(Reader.nextLine())) <= 0)
return getDimension(tableElement);
return Input;
}
我想坚持使用简短的递归方法。它似乎处理&gt; = 0逻辑罚款,但当我传递一个非整数的东西时会爆炸。
有人可以解释为什么会发生这种情况吗?
答案 0 :(得分:1)
hasNextInt()
实际上并不消耗您的输入,因此您在下次调用时会遇到相同的非int输入。
答案 1 :(得分:0)
简单地说,你的代码没有多少(任何?)感觉。
首先,使用要求用户输入的递归方法并不是真的有意义;并且根本不会对传递给它的参数做任何事情!
private int getDimension(String tableElement){
Integer Input= 0;
糟糕:你继续混合int
和`整数。他们不一样。并 - 阅读有关Java编码样式指南。变量名称以小写字母开头!
if( !Reader.hasNextInt() || (Input=Input.parseInt(Reader.nextLine())) <= 0)
第一个条件给出:
true: when there is NO int ...
false: when there is an int
true导致:再次调用您的方法 而不从阅读器中检索值。
false导致解析int;并检查其值为&lt; = 0。
在一个案例中,您正在进行递归调用;完全忽略了你从读者那里得到的输入;在另一种情况下,你返回0;或输入中的那个值。
解决方案:执行以下操作:
while (true) {
if (reader.hasNextInt()) {
input = reader.nextInt();
break;
}
// there is no number!
read.nextLine(); // consume & throw away non-number!
print "Enter a number"
}
代替。
但严肃地说:开始抛弃这段代码。
最后的注意事项:你做Input.parseInt()
...但这是Integer类的静态方法。只需将其称为Integer.parseInt()!但正如所说;抛弃你的代码;并学习如何正确使用该Scanner类;开始阅读here。
答案 2 :(得分:0)
因为用户可以输入任何内容,所以您必须始终阅读该行,然后比较它:
String num = Reader.nextLine();
return num.matches("[1-9][0-9]*") ? Integer.parseInt(num) : getDimension(tableElement);
我在这里使用正则表达式来判断它是否为正数;表达式表示&#34; 1-9个字符,后跟0或更多0-9个字符&#34;