import java.util.scanner,从方法内部使用java.util.Scanner会导致运行时错误

Why would the following code give me a runtime error? It gives me a NoSuchElementException when the method is called the second time. It works fine if I delete the call to stdin.close(), but then Eclipse gives a warning that the resource is not closed.

Code:

import java.util.Scanner;

public class st {

public static void main(String[] args) {

System.out.println("First call");

getInt("Enter first int (1-10): ");

System.out.println("Second call");

getInt("Enter second int (1-10): ");

}

/**

* Reads an integer number from the keyboard.

*

* @param prompt the string to display as a prompt.

* @return the integer number entered at the keyboard.

*/

public static int getInt(String prompt) {

Scanner stdin = new Scanner(System.in);

System.out.print(prompt);

int val = stdin.nextInt();

stdin.close();

return(val);

}

}

// END

Output:

>java st

First call

Enter first int (1-10): 5

Second call

Enter second int (1-10): Exception in thread "main" java.util.NoSuchElementException

at java.util.Scanner.throwFor(Unknown Source)

at java.util.Scanner.next(Unknown Source)

at java.util.Scanner.nextInt(Unknown Source)

at java.util.Scanner.nextInt(Unknown Source)

at st.getInt(st.java:24)

at st.main(st.java:9)

>

Version:

>java -version

java version "1.7.0_21"

Java(TM) SE Runtime Environment (build 1.7.0_21-b11)

Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)

>

Thanks

Brian

解决方案

AS @MikePrecup says, when you close the first Scanner (stdin), you are also closing System.in, therefore the second Scanner can no longer read from it and a NoSuchElementException is thrown.

However, I would suggest another option: use a single scanner declaring it as a class variable.

public class st {

private static Scanner stdin = new Scanner(System.in);

public static void main(String[] args) {

System.out.println("First call");

getInt("Enter first int (1-10): ");

System.out.println("Second call");

getInt("Enter second int (1-10): ");

}

/**

* Reads an integer number from the keyboard.

*

* @param prompt the string to display as a prompt.

* @return the integer number entered at the keyboard.

*/

public static int getInt(String prompt) {

System.out.print(prompt);

int val = stdin.nextInt();

stdin.close();

return(val);

}

}

// END

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值