我创建了一个实用程序类,其方法接受用户输入,并返回它的小写版本,因此我没有那么多重复代码,但它只能使用一次。之后就不会扫描了。我可以做什么来解决这个问题?
附注我看到很多人说重复使用扫描仪是个坏主意。为什么是这样?扫描仪重置一下应该没问题吧?
public String scan() {
String input;
Scanner s = new Scanner(System.in);
if (s.hasNextLine()) {
input = s.nextLine();
} else {
input = "ERROR";
}
s.reset();
s.close();
return input.toLowerCase();
}
每次使用扫描仪时,您都是正确的,它会被重置。您的问题的解决方案如下:
将要传递给
scan()
的所有参数添加到数组中,并使用 for
循环将它们全部传递给 scan()
,同时返回时,再次将它们添加到各自的 数组位置,这样您就可以轻松地随时随地重复使用它们。
您实际上可以重复使用扫描仪,而不是每次需要读取一行时创建一个新的扫描仪,这是一个示例:
public class Test {
public static void main(String[] args) {
Test t = new Test();
//create your scanner object
Scanner s = new Scanner(System.in);
//send it as a parameter whenever you need to read a line
System.out.println(t.scan(s));
System.out.println(t.scan(s));
System.out.println(t.scan(s));
//close it after finishing
s.close();
}
public String scan(Scanner s) {
String input;
if (s.hasNextLine()) {
input = s.nextLine();
} else {
input = "ERROR";
}
return input.toLowerCase();
}
}
但是,如果您为您创建一个阅读器实用程序类,则作为实用程序类中的实例变量更合乎逻辑。
例如:
public class Reader {
Scanner s ;
public Reader() {
s = new Scanner(System.in);
}
public String scan() {
String input;
if (s.hasNextLine()) {
input = s.nextLine();
} else {
input = "ERROR";
}
return input.toLowerCase();
}
public void close(){
s.close();
}
}
当你使用它时,它会是这样的:
public class Main {
public static void main(String[] args) {
//create your scanner object
Reader r = new Reader();
//send it whenever you need to read a line
System.out.println(r.scan());
System.out.println(r.scan());
System.out.println(r.scan());
//close it after finishing
r.close();
}
}
我看到很多人说重复使用是一个坏主意 扫描器。这是为什么?
在大多数情况下,重用扫描仪对象并不是一个坏主意。如果没有进一步的背景,很难确定他们这么说的理由。他们可能弄错了。当他们这么说时,也许你错误地重复使用了它。谁知道?
有一件事是肯定的:当您在从
Scanner#close()
读取的对象中调用 System.in
时,您也会关闭底层输入流。而且,一旦输入流关闭,您就无法在应用程序的生命周期中重新打开它。
扫描仪重置一下应该就可以了吧?
Scanner#reset()
并没有像你想象的那样做。事实上,在这个代码示例中它什么也没做。此方法将 Locale
重置为 US,并将基数重置为基数 10。
public String scan() {
String input;
Scanner s = new Scanner(System.in);
if (s.hasNextLine()) {
input = s.nextLine();
} else {
input = "ERROR";
}
s.reset();
s.close(); // BAD IDEA!!!!
return input.toLowerCase();
}
此方法只能工作一次,原因我已经说过:“一旦输入流关闭,您就无法在应用程序的生命周期中重新打开它。”那么,您会做什么呢?如果您需要一遍又一遍地重用这个
Scanner
对象,最好将其设为类的全局属性,并且永远不应该关闭它。这显然是一个坏主意。因此,您最好使用其他类型的输入流包装器。
也许这就是为什么其他人过去告诉你重复使用扫描仪对象是一个坏主意。这只是猜测。但是,从这个代码示例来看,这种可能性似乎非常大。