当我在同一个应用程序中通过键盘获取多个数据时,此代码给出了一个错误,它给出了IOException错误;
离开do while 时出现错误
我不知道他为什么会犯这种错误。
public static String datoString() {
// Entorno:
BufferedReader br;
String frase;
boolean esCorrecto;
//Algoritmo
frase=null;
br = new BufferedReader(new InputStreamReader(System.in));
try {
do {
System.out.println("Introduce una cadena");
frase = br.readLine();
esCorrecto = true;
} while (!esCorrecto);
} catch (IOException ioe) {
System.err.println("Error I/O");
}
try {
br.close();
} catch (IOException ioe2) {
ioe2.printStackTrace();
}//Fin try
return frase;
}
答案 0 :(得分:2)
通过这样做
br.close();
你实际上是在做这个
System.in.close();
因为BufferedReader
关闭了基础流。
这使得System.in
流不再可用。
你需要做的是做一个小技巧来预先结束System.in
。为此,您可以使用以下包装器
public class ShieldedInputStream extends InputStream {
InputStream source;
public ShieldedInputStream(InputStream source) {
this.source = source;
}
@Override
public int read() throws IOException {
return source.read();
}
@Override
public int read(byte[] b) throws IOException {
return source.read(b);
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
return source.read(b, off, len);
}
@Override
public long skip(long n) throws IOException {
return source.skip(n);
}
@Override
public int available() throws IOException {
return source.available();
}
@Override
public void close() throws IOException {
// source.close(); // We dont awant to close it!
}
@Override
public void mark(int readlimit) {
source.mark(readlimit);
}
@Override
public void reset() throws IOException {
source.reset();
}
@Override
public boolean markSupported() {
return source.markSupported();
}
}
并像这样使用
br = new BufferedReader(new InputStreamReader(new ShieldedInputStream(System.in)));
这样您就可以阻止System.in
关闭,但仍允许您通过关闭BufferedReader
来释放资源