提问人:George S. 提问时间:7/3/2023 最后编辑:user207421George S. 更新时间:7/3/2023 访问量:53
有没有办法在 Java 内部的内部类中使用 Scanners 而无一例外
Is there a way to use Scanners in an inner class inside of Java without an exception
问:
我有一个顶级公共类,通过创建顶级类的实例,然后在顶级类的实例中创建内部类的实例,在同一类中创建一个内部类。
我遇到的问题是,在我创建 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 found
String firstWord = in.next();
答:
0赞
jurez
7/3/2023
#1
当您呼叫时,就像在您的线路中一样Scanner.close()
input.close();
还将关闭它正在读取的基础流。在你的情况下,这关闭了.因此,当您尝试再次使用 in 读取时,没有任何内容可读取,因为流已被关闭。这就是您收到此异常的原因。Scanner
System.in
Scanner
g.gG()
System.in
正确的行为是在使用完后关闭,即在程序结束时。但是,没有必要这样做,因为运行时会在程序退出时自动关闭它。System.in
PS:另外,如果您确实想要或需要关闭某些内容,通常应该使用 or 语句来确保在异常情况下不会跳过该语句,这可能导致内存或资源泄漏。try..finally
try-with-resources
评论
0赞
George S.
7/3/2023
谢谢,只是为了澄清一下,我应该在使用 System.in 时忽略 Java(536871799) 关于潜在资源泄漏的警告,还是在专门处理 System.in 时该警告很重要?再次感谢,您的回答非常简洁,对我有帮助。
1赞
jurez
7/3/2023
和 流是自动管理的,您无需打开或关闭它们。在这方面,您可以安全地忽略警告,或者如果您仍想关闭它,只需使用一个并在两个类之间共享它。System.in
System.out
System.err
Scanner
评论