我正在做一个项目,需要接收和处理来自控制台的输入。我使用eclipse,意外地发现当我在控制台中按CTRL+Z (没有按ENTER之后)时,程序会使用NoSuchElementException崩溃,我认为这是Scanner.nextLine()方法抛出的。下面是它的简化版本。
Test.java
import java.util.NoSuchElementException;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = "";
while(true) {
System.out.printf("Say something: ");
input = scanner.nextLine();
String output = input.trim().toUpperCase();
if(output.equals("Q")) {
break;
}
System.out.printf("Uppercase: %s\n", output);
}
scanner.close();
}
}下面是我的测试结果:
Say something: hey
Uppercase: HEY
Say something: i'm boutta crash this program by pressing ctrl+z
Uppercase: I'M BOUTTA CRASH THIS PROGRAM BY PRESSING CTRL+Z
Say something: Exception in thread "main" java.util.NoSuchElementException: No line found
at java.base/java.util.Scanner.nextLine(Scanner.java:1656)
at Test.main(Test.java:11)我还用javac Test.java编译了javac Test.java文件,并在Windows提示符下与java Test一起运行。这是输出。
C:\>cd Test
C:\Test>javac Test.java
C:\Test>java Test
Say something: i'm gonna press ctrl+c
Uppercase: I'M GONNA PRESS CTRL+C
Say something: Exception in thread "main" java.util.NoSuchElementException: No line found
^C
C:\Test>有没有办法防止扫描仪读取CTRL+Z和CTRL+V?预先感谢您的任何帮助/解释。
我尝试用try/catch块包围行input = scanner.nextLine();。这是我的尝试。
try {
input = scanner.nextLine();
} catch(NoSuchElementException e) {
scanner = new Scanner(System.in);
System.out.printf("caught NoSuchElementException\n");
}我有一个无限的循环。
Say something: pressing ctrl+z...
Uppercase: PRESSING CTRL+Z...
Say something: caught NoSuchElementException
Uppercase: PRESSING CTRL+Z...
Say something: caught NoSuchElementException
Uppercase: PRESSING CTRL+Z...
Say something: caught NoSuchElementException
Uppercase: PRESSING CTRL+Z...
...发布于 2022-11-23 05:15:41
windows中的ctrl+z或Linux中的ctrl+z是用于输入端的DOS命令.因此,如果您在Linux中部署您的程序,那么ctrl的输入也会是相同的。您应该通过调用方法scanner.hasNextLine()来处理这个问题,该方法只有在有输入时才返回true。我已经附加了修改过的程序,它运行。你可以参考。
public class ControlPlusZ {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = "";
while(true) {
System.out.printf("Say something: ");
if(scanner.hasNextLine()) {
System.out.println(scanner.hasNextLine());
input = scanner.nextLine();
String output = input.trim().toUpperCase();
if(output.equals("Q")) {
break;
}
System.out.printf("Uppercase: %s\n", output);
}
else {System.out.println("Closing scanner");
break;}}
scanner.close();
}}
https://stackoverflow.com/questions/74540372
复制相似问题