为什么 while 不会在第二个循环停止
why the while does not stop at the second loop
在第一个循环中 while 停止并等待 incomStr = view.read();
处的控制台输入,但在第二个循环中它不会停止,读取 null
并继续。
为什么会这样?
public void mainDialogueHolder() {//todo
setCmdState(CmdLineState.WAIT);
view.write("Hello, user!");
view.write("Please, type `help` for list available commands. ");
while (getCMDState().equals(CmdLineState.WAIT)){
String incomStr;
incomStr = view.read();//implementation is below
readCmd(incomStr);
}
}
视图的实现
public class Console implements View {
@Override
public void write(String message) {
System.out.println(message);
}
@Override
public String read() {
try (
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))
){
return reader.readLine();
} catch (IOException ex) {
System.out.println(ex.getMessage());
return null;
}
}
}
好吧,看来您尝试使用资源通过关闭 BufferedReader 来关闭 System.in,而 BufferedReader 又会关闭它的 Reader (InputStreamReader) 并且那个关闭 System.in。
System.in 是最终静态的,因此一旦关闭它就无法再次使用它,因为无法重新打开它。
那么如果我无法关闭它,我该怎么办?
也许你可以像这里建议的那样写一个包装器 In Java is it possible to re-open System.in after closing it
在第一个循环中 while 停止并等待 incomStr = view.read();
处的控制台输入,但在第二个循环中它不会停止,读取 null
并继续。
为什么会这样?
public void mainDialogueHolder() {//todo
setCmdState(CmdLineState.WAIT);
view.write("Hello, user!");
view.write("Please, type `help` for list available commands. ");
while (getCMDState().equals(CmdLineState.WAIT)){
String incomStr;
incomStr = view.read();//implementation is below
readCmd(incomStr);
}
}
视图的实现
public class Console implements View {
@Override
public void write(String message) {
System.out.println(message);
}
@Override
public String read() {
try (
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))
){
return reader.readLine();
} catch (IOException ex) {
System.out.println(ex.getMessage());
return null;
}
}
}
好吧,看来您尝试使用资源通过关闭 BufferedReader 来关闭 System.in,而 BufferedReader 又会关闭它的 Reader (InputStreamReader) 并且那个关闭 System.in。 System.in 是最终静态的,因此一旦关闭它就无法再次使用它,因为无法重新打开它。 那么如果我无法关闭它,我该怎么办? 也许你可以像这里建议的那样写一个包装器 In Java is it possible to re-open System.in after closing it