所以我正在编写Snake,我有一个方法从控制台读取一个整数值 当我的方法抛出一个错误 - 或者至少当我回到那个方法时 - 它不会从输入中读取新行,而只是传递一个空字符串 这是我的代码:
AudioTrack
我在程序开始时将“sc”声明为静态类变量static int readInInt()
{
//We Read in the next line the user enters
String s = sc.nextLine();
//x returns -1 if mistake happens
int x = -1;
try
{
//Now we try to parse that int
x = Integer.parseInt(s);
x = Math.abs(x);
System.out.println("Setting the speed to " + (x*100) + "ms.");
}
catch(NumberFormatException ex)
{
//If we can't parse it we try to get the ints with a regex and then parse it
System.out.println("Du hast eine nummer eingetippt die das System nicht analysieren kann.");
System.out.println("Das System probiert jetzt die Nummer die du eingetippt hast über umwege zu Analysieren.");
s = s.replaceAll("[^-?0-9]+", "");
try
{
x = Integer.parseInt(s);
}
catch(Exception e)
{
//and if that doesnt work we just say Error!
System.out.println("Error Handling didn't work.\n"
+ "Please try again with just a simple number (e.g. 7)");
//Return an Error in form of -1
return -1;
}
x = Math.abs(x);
System.out.println("Setting the speed to " + (x*100) + "ms.");
}
return x;
}
。
为什么扫描仪会返回一个空字符串? - 无需用户输入 -
是的,我知道方法.readNextInt,但我觉得处理这样的异常更容易。
答案 0 :(得分:0)
感谢@Seelenvirtuose带我走上解决方案的正确轨道!
我说过,如果在另一个地方使用sc.nextInt(),你就会有一个未被消费的待定换行符。下一个sc.nextLine()仅使用此换行符,并且不会优先输入任何内容。因此,问题在于代码的另一部分! -
解决方案是,在我的代码的某些部分,我使用sc.next()
只读取下一个字符串,直到空格(如果我没有记错)而不是sc.nextLine()
。
所以我已将所有sc.next()
更改为sc.nextLine()
,但它没有正常工作。
我在跟踪和错误时找到了其他2个解决方案:
a)Wrtie sc.reset()
执行“重置扫描程序会丢弃所有显式状态信息[...] ”bevor访问sc.nextLine()
命令或
b)只需创建 Scanner 类的新instanz。
再次感谢Seelenvirtuose。
答案 1 :(得分:0)
我用两种不同的扫描仪解决了:一种用于读取int和float值,另一种用于读取String。
Scanner scanString = new Scanner(System.in);
Scanner scanIntFloat = new Scanner(System.in);
int cod = scanIntFloat.nextInt();
String name = scanString.nextLine();
伊莱亚斯。
答案 2 :(得分:0)
您可以使用两个不同的扫描仪 .......
用于读取 int ,浮动和 double 的第一台扫描仪。
第二个扫描器,用于读取字符串值。
像下面一样……
Scanner scanIntFloat = new Scanner(System.in);
Scanner scanString = new Scanner(System.in);
int cod = scanIntFloat.nextInt();
String name = scanString.nextLine();
答案 3 :(得分:0)
有类似的问题。 我所做的是添加了nextLine(); next()之后的命令;命令来捕获填满您放置输入请求的缓冲区的字符。
基本上:
希望这会有所帮助:)
答案 4 :(得分:0)
这是扫描仪的错误。读取非字符串值后,在 Scanner 对象上调用 nextLine()
,然后使用 nextLine()