首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.util.Scanner问题与CTRL+Z,CTRL+C,CTRL+X

java.util.Scanner问题与CTRL+Z,CTRL+C,CTRL+X
EN

Stack Overflow用户
提问于 2022-11-23 00:04:52
回答 1查看 40关注 0票数 1

我正在做一个项目,需要接收和处理来自控制台的输入。我使用eclipse,意外地发现当我在控制台中按CTRL+Z (没有按ENTER之后)时,程序会使用NoSuchElementException崩溃,我认为这是Scanner.nextLine()方法抛出的。下面是它的简化版本。

Test.java

代码语言:javascript
复制
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();
    }
    
}

下面是我的测试结果:

代码语言:javascript
复制
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一起运行。这是输出。

代码语言:javascript
复制
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();。这是我的尝试。

代码语言:javascript
复制
try {
                input = scanner.nextLine();
            } catch(NoSuchElementException e) {
                scanner = new Scanner(System.in);
                System.out.printf("caught NoSuchElementException\n");
            }

我有一个无限的循环。

代码语言:javascript
复制
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...
...
EN

回答 1

Stack Overflow用户

发布于 2022-11-23 05:15:41

windows中的ctrl+z或Linux中的ctrl+z是用于输入端的DOS命令.因此,如果您在Linux中部署您的程序,那么ctrl的输入也会是相同的。您应该通过调用方法scanner.hasNextLine()来处理这个问题,该方法只有在有输入时才返回true。我已经附加了修改过的程序,它运行。你可以参考。

代码语言:javascript
复制
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();
}

}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74540372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档