我有Java代码要求用户输入,然后将这些数据存储在字符串变量中。下面的函数是一个名为'number'的类的一部分,在main函数中调用。
public static void setVal(int i){
Scanner readIn = new Scanner(System.in);
//while (readIn.hasNextLine()){
str = readIn.nextLine();
numCheck = false;
if (i == 1){
while (!numCheck){
if (str.contains(" ")){
System.out.println("Please input a single item.");
str = readIn.nextLine();
}
else if (!isNumeric(str)){
System.out.println("Please input a valid number.");
str = readIn.nextLine();
}
else {
numCheck = true;
value = Double.parseDouble(str);
readIn.close();
}
}
readIn.close();
}
else if (i == 2){
while (!numCheck){
if (str.contains(" ")){
System.out.println("Please input a single item.");
str = readIn.nextLine();
}
else if (!isNumeric(str)){
System.out.println("Please input a valid number.");
str = readIn.nextLine();
}
else {
numCheck = true;
secondV = Double.parseDouble(str);
readIn.close();
}
}
readIn.close();
}
else {
System.out.println("An error has occurred.");
}
// }
readIn.close();
}
主要功能的一部分如下所示:
number input = new number();
for (int i = 1; i <= 2; i++){
input.setVal(i);
System.out.println("Now please input a second value for computing with the first.");
input.setVal(i);
}
我使用相同的函数两次但是将它交给一个不同的参数来区分输入到另一个变量的分配,但是当它第二次运行时它会抛出一个no line found错误。
应用其他一些建议,你可以看到注释掉了我已经添加'hasNextLine()'检查以检查在执行代码之前该行是否存在但是这最终导致'扫描仪已关闭'错误,即使我调用了一个新实例每次运行时扫描仪的数量。我还适当地关闭了扫描仪,以确保最大限度地减少错误。
我不知道出了什么问题因为我可以在main函数中创建一个Scanner并且在没有错误的情况下多次调用'.nextLine()'但是当通过类方法再次调用时,我会收到这些错误。
提前感谢任何帮助。
答案 0 :(得分:2)
Scanner.close()文档声明
如果此扫描仪尚未关闭,则表明其底层 read也实现了Closeable接口,然后是可读的接口 将调用close方法。如果此扫描仪已经关闭,那么 调用此方法将无效。
在关闭扫描程序时,您还关闭了System.in输入流,因此当您重新打开扫描程序时,它将找不到任何打开的输入流。
参考:java.util.NoSuchElementException - Scanner reading user input
最好将外部方法中的scanner对象作为参数传递,然后只有在完成后才能在调用方法中将其关闭。
要指出,你的String对象是str
静态吗?
如果没有,那么您无法在静态方法中使用它。最好从方法声明中删除静态。
答案 1 :(得分:0)
完成所有操作后,您必须关闭扫描仪。
答案 2 :(得分:0)
您已关闭扫描程序inout stream readIn.close();两次。
在从文件中逐行选择之前关闭流。所以在完成所有使用readIn的实例后,你必须关闭它。