当前位置: 代码迷 >> Java相关 >> cmd界面 用%java xxx <input.txt 出错
  详细解决方案

cmd界面 用%java xxx <input.txt 出错

热度:602   发布时间:2016-04-22 20:57:59.0
cmd界面 用%java xxx <input.txt 报错
求助: 

运行如下代码,如果手动在console输入不会出任何问题,但如果在cmd里 用 %java t5 <input.txt 就会报错NoSuchElementException

input.txt 内容:
aaa
bbb
---------------------------------
import java.util.Scanner;

public class t5 {

public String print()
{
Scanner in = new Scanner(System.in);
String sc =in.next();
return sc;
}


public static void main(String[] args) {


        System.out.println(new t5().print());// call 1st time
        System.out.println(new t5().print());// if call 2nd time, in.next() will not get any value, throw out NoSuchElementException

}

}
----------------------------
输出:

------解决思路----------------------
你scanner应该一次性把所有的输入读完啊。
------解决思路----------------------
Scanner内部有个buf  , 所以你读取之后会把System.in中的内容缓存起来,这也意味着你下次再用System.in构建一个Scanner的时候里面其实已经被读取了。
解决方案是你把Scanner的定义抽取出来 比如说做成类成员变量 然后在构造方法里面进行初始化 , print的方法里面直接使用即可。 另外为了代码健壮性, 需要在调用next之前先判断是否hasNext


------解决思路----------------------
参考2L写的代码

2L阐释的很清晰

/**
 *
 */
package com.suzhw.console;

/**@author suzhw<br>
 * 日期:2014-9-21<br>
 * 功能:<br>
 * 版权:版权所有(C) 2014,suzhw<br>
 * @version v0.1
 * @see
 */
import java.util.Scanner;

public class t5 {
public static Scanner in = new Scanner(System.in);
public String print() {
String sc = in.next();
return sc;
}

public static void main(String[] args) {

System.out.println(new t5().print());// call 1st time
System.out.println(new t5().print());// if call 2nd time, in.next() will
// not get any value, throw out
// NoSuchElementException

}

}

------解决思路----------------------
引用:
Quote: 引用:

你scanner应该一次性把所有的输入读完啊。

我有好多不同的类里都需要有scanner,如果在主函数调用的话,就形成了多个scanner的情况了


System.in是一个静态变量

上一个Scanner读取它后,它处于已被读取的状态

因此,下一个Scanner再进行读取,就报错了

相当于:
B(看作第二个Scanner)去取快递,但快递已经被被A(看作第一个Scanner)拿走了,
B还不报警(抛出异常)吗?
------解决思路----------------------
引用:
Quote: 引用:

你scanner应该一次性把所有的输入读完啊。

我有好多不同的类里都需要有scanner,如果在主函数调用的话,就形成了多个scanner的情况了


那就用一个scanner,一次按需要读入相应的行数。
  相关解决方案