gpt4 book ai didi

java - 如何在不关闭底层System.in的情况下关闭扫描仪?

转载 作者:行者123 更新时间:2023-11-30 03:46:37 25 4
gpt4 key购买 nike

如果我关闭一个扫描仪对象并创建一个新的扫描仪对象并尝试读取更多输入,我将收到 NoSuchElementException 异常。

我的代码工作正常,但如果我不关闭扫描仪,它会发出警告。但是,如果我关闭它以消除警告,我也会关闭 System.in ...我如何避免这种情况?

另外,不关闭扫描仪有什么后果吗?

编辑:这是我的代码:

这是 NameAddressExists() 方法:

public void NameAddressExists() {
System.out.println("Enter name");
Scanner sc = new Scanner(System.in);
String n = sc.next();
System.out.println("Enter address");
String a = sc.next();
int flag = 0;
for(int i = 0; i < count; i++) {
if(array[i].name .equals(n) && array[i].address .equals(a)) {
System.out.println("True");
flag = 1;
}
}
if(flag != 1) {
new Agency(n, a);
}
sc.close();
}

这是 PanNumberExists() 方法:

public boolean PanNumberExists() {
Scanner s = new Scanner(System.in);
String n = "";
System.out.println("Enter the 5 digits");
try {
n = s.nextLine();
}catch(Exception e) {
System.out.println(e);
}finally {
s.close();
}
if(n .equals(this.PAN.subSequence(4,9))) {
return true;
}
else {
return false;
}
}

这些方法是从以下 main() 方法调用的:

public static void main(String args[]) {
Agency obj1 = new Agency("XYZ", "ABCD");
Agency obj2 = new Agency("XYZ", "ABCDEFG", "+91083226852521", "ab 1234567", "abcd12345ab");
// Agency obj3 = new Agency("XYZ", "TSRK", "36", "ab 1234567", "abcd12345ab");
obj1.NameAddressExists();
System.out.println(obj2.PanNumberExists());
}

如您所见,我首先调用 NameAddressExists() 方法,在该方法中我打开、使用和关闭名为“sc”的 Scanner。这工作正常并给我正确的输出。接下来,我调用 PanNumberExists() 方法,在该方法中我打开另一个名为 's' 的 Scanner 并尝试使用它从用户获取一些输入。这是我收到 NoSuchElementException 异常的地方。如果我在 NameAddressExists() 方法中将 Scanner 'sc' 保持打开状态,则不会收到此错误。

最佳答案

您可以使用装饰器模式并创建无法关闭的自定义InputStream,然后将其传递给Scanner

import java.io.IOException;
import java.io.InputStream;

public class PreventClosingInputStream extends InputStream {

private InputStream inputStream;

public PreventClosingInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}

@Override
public int read() throws IOException {
return inputStream.read();
}

@Override
public void close() throws IOException {
// Don't call super.close();
}

}

然后,在您的代码中:

PreventClosingInputStream in = new PreventClosingInputStream(System.in);
Scanner s = new Scanner(in);
// ...
s.close(); // This will never close System.in as there is underlying PreventClosingInputStream with empty close() method

使用尝试资源:

try (PreventClosingInputStream in = new PreventClosingInputStream(System.in);
Scanner s = new Scanner(in);) {
// ...
// resources will be automatically closed except of System.in
}

关于java - 如何在不关闭底层System.in的情况下关闭扫描仪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25506240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com