如果第一个scanner对象不关掉,就不会报错。想知道为什么。
个人认为这是我们大家都会经常犯的错,但是网上找不到解释。希望大神出现。
简化的代码如下所示
import java.util.Scanner;
public class TempTest{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
//if(sc.hasNext())
String s=sc.nextLine();
sc.close();
Scanner sc2=new Scanner(System.in);
sc2.nextLine();
sc2.close();
}
}
15 个解决方案
#1
sc.close()会把System.in也关掉,所以...
#2
public void close()关闭此扫描器。
如果此扫描器尚未关闭,并且其底层 readable 也实现 Closeable 接口,则该 readable 的 close 方法将被调用。
System.in是InputStream的对象,并且关掉之后不能再打开
如果此扫描器尚未关闭,并且其底层 readable 也实现 Closeable 接口,则该 readable 的 close 方法将被调用。
System.in是InputStream的对象,并且关掉之后不能再打开
#3
那么怎样实现在不同的地方读取呢?用Scanner类
#4
Java 是顺序执行的 你执行到.close() 后就代表 你关闭了 流,你再去调用已经被你关闭的流 显然是不现实的
我的建议是 你做几个方法里面包含输入流,然后在main里面调用就可以了
我的建议是 你做几个方法里面包含输入流,然后在main里面调用就可以了
#5
如果非要用System.in,那么在没有全部读取完之前不要关闭Scanner
#6
就是说第一个Scanner对象不要关闭,再申请第二个对象。
看到youwarning 总觉得不爽啊。。。
安如果不用Scanner还有没有其他更好的方法,实现在多处读取控制台的输入,希望有代码哦
#7
也可以用这个
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
这个reader也不能关闭,不过它没有never closed警告
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
这个reader也不能关闭,不过它没有never closed警告
#8
也可以用这个
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
这个reader也不能关闭,不过它没有never closed警告
太麻烦了呀,不仅创建对象麻烦,而且还要加try…catch。
难道就没有一个更简单的方法吗?
我觉得应该有某个通用的方法处理这类问题吧!
#9
主要问题是System.in不能重新打开,所以可以在程序结束时关闭
final Scanner scanner=new Scanner(System.in);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
scanner.close();
}
});
#10
主要问题是System.in不能重新打开,所以可以在程序结束时关闭
final Scanner scanner=new Scanner(System.in);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
scanner.close();
}
});
我专门写了一个类
class input
{
final static Scanner sc=new Scanner(System.in);
}
以后每次都调用input.sc,最后再把它关掉。这样就好了。
非常感谢你,你的回答太专业了!
#11
主要问题是System.in不能重新打开,所以可以在程序结束时关闭
final Scanner scanner=new Scanner(System.in);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
scanner.close();
}
});
我是一个本科的菜鸟,还想多问一个关于输入的问题
Console cons=System.console();
创建的console对象为什么是null
比如下面的代码执行不会成功
Console cons;
char[] passwd;
if ((cons = System.console()) != null &&
(passwd = cons.readPassword("[%s]", "Password:"))!= null) {
...
java.util.Arrays.fill(passwd, ' ');
}
#12
上了一课
#13
你用的是Eclipse吧?Eclipse运行java程序用的是javaw,不关联控制台,所以System.console()是null
如果通过cmd运行java命令就好了
如果通过cmd运行java命令就好了
#14
你用的是Eclipse吧?Eclipse运行java程序用的是javaw,不关联控制台,所以System.console()是null
如果通过cmd运行java命令就好了
虽说这种问题很低级,但是如果没扔告诉的话,自己一时也想不到。
我学java时间很短,很多问题都不清除,谢谢指教,非常感谢你。
#15
主要问题是System.in不能重新打开,所以可以在程序结束时关闭
final Scanner scanner=new Scanner(System.in);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
scanner.close();
}
});
我专门写了一个类class input
{
final static Scanner sc=new Scanner(System.in);
}
以后每次都调用input.sc,最后再把它关掉。这样就好了。
非常感谢你,你的回答太专业了!
请问为什么你把它写成静态变量就可以关闭再开启了呢,这个的原理是什么
#1
sc.close()会把System.in也关掉,所以...
#2
public void close()关闭此扫描器。
如果此扫描器尚未关闭,并且其底层 readable 也实现 Closeable 接口,则该 readable 的 close 方法将被调用。
System.in是InputStream的对象,并且关掉之后不能再打开
如果此扫描器尚未关闭,并且其底层 readable 也实现 Closeable 接口,则该 readable 的 close 方法将被调用。
System.in是InputStream的对象,并且关掉之后不能再打开
#3
那么怎样实现在不同的地方读取呢?用Scanner类
#4
Java 是顺序执行的 你执行到.close() 后就代表 你关闭了 流,你再去调用已经被你关闭的流 显然是不现实的
我的建议是 你做几个方法里面包含输入流,然后在main里面调用就可以了
我的建议是 你做几个方法里面包含输入流,然后在main里面调用就可以了
#5
那么怎样实现在不同的地方读取呢?用Scanner类
如果非要用System.in,那么在没有全部读取完之前不要关闭Scanner
#6
那么怎样实现在不同的地方读取呢?用Scanner类
如果非要用System.in,那么在没有全部读取完之前不要关闭Scanner
就是说第一个Scanner对象不要关闭,再申请第二个对象。
看到youwarning 总觉得不爽啊。。。
安如果不用Scanner还有没有其他更好的方法,实现在多处读取控制台的输入,希望有代码哦
#7
也可以用这个
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
这个reader也不能关闭,不过它没有never closed警告
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
这个reader也不能关闭,不过它没有never closed警告
#8
也可以用这个
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
这个reader也不能关闭,不过它没有never closed警告
太麻烦了呀,不仅创建对象麻烦,而且还要加try…catch。
难道就没有一个更简单的方法吗?
我觉得应该有某个通用的方法处理这类问题吧!
#9
主要问题是System.in不能重新打开,所以可以在程序结束时关闭
final Scanner scanner=new Scanner(System.in);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
scanner.close();
}
});
#10
主要问题是System.in不能重新打开,所以可以在程序结束时关闭
final Scanner scanner=new Scanner(System.in);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
scanner.close();
}
});
我专门写了一个类
class input
{
final static Scanner sc=new Scanner(System.in);
}
以后每次都调用input.sc,最后再把它关掉。这样就好了。
非常感谢你,你的回答太专业了!
#11
主要问题是System.in不能重新打开,所以可以在程序结束时关闭
final Scanner scanner=new Scanner(System.in);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
scanner.close();
}
});
我是一个本科的菜鸟,还想多问一个关于输入的问题
Console cons=System.console();
创建的console对象为什么是null
比如下面的代码执行不会成功
Console cons;
char[] passwd;
if ((cons = System.console()) != null &&
(passwd = cons.readPassword("[%s]", "Password:"))!= null) {
...
java.util.Arrays.fill(passwd, ' ');
}
#12
上了一课
#13
你用的是Eclipse吧?Eclipse运行java程序用的是javaw,不关联控制台,所以System.console()是null
如果通过cmd运行java命令就好了
如果通过cmd运行java命令就好了
#14
你用的是Eclipse吧?Eclipse运行java程序用的是javaw,不关联控制台,所以System.console()是null
如果通过cmd运行java命令就好了
虽说这种问题很低级,但是如果没扔告诉的话,自己一时也想不到。
我学java时间很短,很多问题都不清除,谢谢指教,非常感谢你。
#15
主要问题是System.in不能重新打开,所以可以在程序结束时关闭
final Scanner scanner=new Scanner(System.in);
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
scanner.close();
}
});
我专门写了一个类class input
{
final static Scanner sc=new Scanner(System.in);
}
以后每次都调用input.sc,最后再把它关掉。这样就好了。
非常感谢你,你的回答太专业了!
请问为什么你把它写成静态变量就可以关闭再开启了呢,这个的原理是什么