有没有办法在 Java 内部的内部类中使用 Scanners 而无一例外

Is there a way to use Scanners in an inner class inside of Java without an exception

提问人:George S. 提问时间:7/3/2023 最后编辑:user207421George S. 更新时间:7/3/2023 访问量:53

问:

我有一个顶级公共类,通过创建顶级类的实例,然后在顶级类的实例中创建内部类的实例,在同一类中创建一个内部类。

我遇到的问题是,在我创建 Scanner 对象并尝试运行该方法后,程序不允许终端输入任何内容,然后抛出一个错误,因为没有令牌供它拾取。next()

我尝试使用该方法并使用try_catch。对我来说,预期的行为是 Scanner 对象让 Thread 等待来自终端的输入。hasNext()

这是我的代码:

import java.util.Scanner;

public class ScannerTest {
    public static void main(String args[]){
        Scanner input  = new Scanner(System.in);
        System.out.print("ENTER A NUMBER: ");
        int inputValue = input.nextInt();
        input.close();
        System.out.printf("%d multiplied by 5 is equal to %d%n%n", inputValue, inputValue*5);

        ScannerTest m = new ScannerTest();
        Scanner2 g = m.new Scanner2();
        g.gG();
    }

    private class Scanner2{

        public void gG(){

            Scanner in = new Scanner(System.in);

            System.out.println("Please enter a word: ");

            String firstWord = in.next();
            in.close();

            System.out.println("First word: " + firstWord); 
        }
    }
}

异常 - - 在达到时发生。同样,这段代码显然在正常情况下不会很有用,但我正在尝试尝试什么是可能的。Exception in thread "main" java.util.NoSuchElementException: No line foundString firstWord = in.next();

Java java.util.scanner 内部类

评论

0赞 Abra 7/3/2023
在发布问题之前,您是否尝试过搜索?请参阅如何提问
0赞 user207421 7/3/2023
“非静态内在”是一种重言式。

答:

0赞 jurez 7/3/2023 #1

当您呼叫时,就像在您的线路中一样Scanner.close()

input.close();

还将关闭它正在读取的基础流。在你的情况下,这关闭了.因此,当您尝试再次使用 in 读取时,没有任何内容可读取,因为流已被关闭。这就是您收到此异常的原因。ScannerSystem.inScannerg.gG()System.in

正确的行为是在使用完后关闭,即在程序结束时。但是,没有必要这样做,因为运行时会在程序退出时自动关闭它。System.in

PS:另外,如果您确实想要或需要关闭某些内容,通常应该使用 or 语句来确保在异常情况下不会跳过该语句,这可能导致内存或资源泄漏。try..finallytry-with-resources

评论

0赞 George S. 7/3/2023
谢谢,只是为了澄清一下,我应该在使用 System.in 时忽略 Java(536871799) 关于潜在资源泄漏的警告,还是在专门处理 System.in 时该警告很重要?再次感谢,您的回答非常简洁,对我有帮助。
1赞 jurez 7/3/2023
和 流是自动管理的,您无需打开或关闭它们。在这方面,您可以安全地忽略警告,或者如果您仍想关闭它,只需使用一个并在两个类之间共享它。System.inSystem.outSystem.errScanner