Scanner类抛出java.util.NoSuchElementException: No line found的异常

时间:2022-12-13 20:34:26
我需要在程序的不同的地方创建多个scanner对象读取一整行信息,每次用完后都很自然得调用了close方法关掉,当第二个scanner对象调用nextLine时就会出现NoSuchElementException: No line found的异常。
如果第一个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的对象,并且关掉之后不能再打开

#3


那么怎样实现在不同的地方读取呢?用Scanner类

#4


Java 是顺序执行的 你执行到.close() 后就代表 你关闭了 流,你再去调用已经被你关闭的流 显然是不现实的
我的建议是 你做几个方法里面包含输入流,然后在main里面调用就可以了

#5


引用 3 楼 using_name 的回复:
那么怎样实现在不同的地方读取呢?用Scanner类

如果非要用System.in,那么在没有全部读取完之前不要关闭Scanner

#6


引用 5 楼 waynexuan 的回复:
Quote: 引用 3 楼 using_name 的回复:

那么怎样实现在不同的地方读取呢?用Scanner类

如果非要用System.in,那么在没有全部读取完之前不要关闭Scanner

就是说第一个Scanner对象不要关闭,再申请第二个对象。
看到youwarning 总觉得不爽啊。。。
安如果不用Scanner还有没有其他更好的方法,实现在多处读取控制台的输入,希望有代码哦

#7


也可以用这个
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
这个reader也不能关闭,不过它没有never closed警告

#8


引用 7 楼 waynexuan 的回复:
也可以用这个
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


引用 9 楼 waynexuan 的回复:
主要问题是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


引用 9 楼 waynexuan 的回复:
主要问题是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


Scanner类抛出java.util.NoSuchElementException: No line found的异常上了一课

#13


你用的是Eclipse吧?Eclipse运行java程序用的是javaw,不关联控制台,所以System.console()是null
如果通过cmd运行java命令就好了

#14


引用 13 楼 waynexuan 的回复:
你用的是Eclipse吧?Eclipse运行java程序用的是javaw,不关联控制台,所以System.console()是null
如果通过cmd运行java命令就好了

虽说这种问题很低级,但是如果没扔告诉的话,自己一时也想不到。
我学java时间很短,很多问题都不清除,谢谢指教,非常感谢你。

#15


引用 10 楼 using_name 的回复:
Quote: 引用 9 楼 waynexuan 的回复:

主要问题是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的对象,并且关掉之后不能再打开

#3


那么怎样实现在不同的地方读取呢?用Scanner类

#4


Java 是顺序执行的 你执行到.close() 后就代表 你关闭了 流,你再去调用已经被你关闭的流 显然是不现实的
我的建议是 你做几个方法里面包含输入流,然后在main里面调用就可以了

#5


引用 3 楼 using_name 的回复:
那么怎样实现在不同的地方读取呢?用Scanner类

如果非要用System.in,那么在没有全部读取完之前不要关闭Scanner

#6


引用 5 楼 waynexuan 的回复:
Quote: 引用 3 楼 using_name 的回复:

那么怎样实现在不同的地方读取呢?用Scanner类

如果非要用System.in,那么在没有全部读取完之前不要关闭Scanner

就是说第一个Scanner对象不要关闭,再申请第二个对象。
看到youwarning 总觉得不爽啊。。。
安如果不用Scanner还有没有其他更好的方法,实现在多处读取控制台的输入,希望有代码哦

#7


也可以用这个
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
这个reader也不能关闭,不过它没有never closed警告

#8


引用 7 楼 waynexuan 的回复:
也可以用这个
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


引用 9 楼 waynexuan 的回复:
主要问题是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


引用 9 楼 waynexuan 的回复:
主要问题是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


Scanner类抛出java.util.NoSuchElementException: No line found的异常上了一课

#13


你用的是Eclipse吧?Eclipse运行java程序用的是javaw,不关联控制台,所以System.console()是null
如果通过cmd运行java命令就好了

#14


引用 13 楼 waynexuan 的回复:
你用的是Eclipse吧?Eclipse运行java程序用的是javaw,不关联控制台,所以System.console()是null
如果通过cmd运行java命令就好了

虽说这种问题很低级,但是如果没扔告诉的话,自己一时也想不到。
我学java时间很短,很多问题都不清除,谢谢指教,非常感谢你。

#15


引用 10 楼 using_name 的回复:
Quote: 引用 9 楼 waynexuan 的回复:

主要问题是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,最后再把它关掉。这样就好了。
非常感谢你,你的回答太专业了!


请问为什么你把它写成静态变量就可以关闭再开启了呢,这个的原理是什么