Scanner类throwFor(Unknown Source)及跳过下一个扫描器分析

在使用Scanner类时遇到一个问题:

1 Exception in thread "main" java.util.NoSuchElementException
2     at java.util.Scanner.throwFor(Unknown Source)
3     at java.util.Scanner.next(Unknown Source)

在执行scanner.next()时遇到异常。Stack Overflow上给出了问题原因与解决办法。

原因:当一个类中两个及两个以上的Scanner实例时,其中一个Scanner类的实例执行scanner.close()方法会关闭其他潜在的InputStream流,导致其他Scanner的扫描器无法读取输入流。

解决办法:对于控制台程序,在程序运行中只注册一个Scanner类的实例从System.in中读取信息。

问题二:使用Scanner#nextInt()时跳过下一个扫描器。

产生原因:在使用Scanner#nextInt()时,nextInt()在遇到 ‘\n‘之前结束,但“\n"会被下一个扫描器所接收,如Scanner#nextLine(),从而直接跳过Scanner#nextLine()。

解决办法:统一使用Scanner#nextLine()代替所有扫描函数。然后进行强制类型转换。

1 String nextIntString = keyboard.nextLine(); //get the number as a single line
2 int nextInt = Integer.parseInt(nextIntString); //convert the string to an int

问题一解释

You close the second Scanner which closes the underlying InputStream, therefore the first Scanner can no longer read from the same InputStream and a NoSuchElementException results.

The solution: For console apps, use a single Scanner to read from System.in.

Aside: As stated already, be aware that Scanner#nextInt does not consume newline characters. Ensure that these are consumed before attempting to call nextLine again by using Scanner#newLine().

问题二解释:

The nextInt() method leaves the \n (end line) symbol and is picked up immediately by nextLine(), skipping over the next input. What you want to do is use nextLine() for everything, and parse it later:

String nextIntString = keyboard.nextLine(); //get the number as a single line
int nextInt = Integer.parseInt(nextIntString); //convert the string to an int

This is by far the easiest way to avoid problems--don‘t mix your "next" methods. Use only nextLine() and then parse ints or separate words afterwards.



Also, make sure you use only one Scanner if your are only using one terminal for input. That could be another reason for the exception.



Last note: compare a String with the .equals() function, not the == operator.

if (playAgain == "yes"); // Causes problems
if (playAgain.equals("yes")); // Works every time
时间: 2024-10-28 20:51:40

Scanner类throwFor(Unknown Source)及跳过下一个扫描器分析的相关文章

回车跳到下一个EDIT

1.按下方法procedure TForm2.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);begin if Key=VK_RETURN then SelectNext(ActiveControl,true,true);end; 2.按下经过procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);begin 方法1: if key=#13 th

解决iPhone上select时常失去焦点,随意跳到下一个输入框,影响用户操作

window.addEventListener('load', function() { FastClick.attach(document.body); }, false); //300s延迟,解决iPhone上select时常失去焦点,随意跳到下一个输入框,影响用户操作 结合fastclick.min.js使用

js input框输入1位数字后自动跳到下一个input框聚焦

// input框输入1位数字后自动跳到下一个input聚焦 function goNextInput(el){ var txts = document.querySelectorAll(el); for(var i = 0; i<txts.length;i++){ var t = txts[i]; t.index = i; t.setAttribute("readonly", true); t.onkeyup=function(){ this.value=this.value.

EditText切换输入法软件的enter按键,实现跳到下一个EditText或搜索等

首先,输入法软件的enter键其实是可以变的,可以变next,搜索等等 例如:实现一个登陆界面 代码如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft=&

按回车键自动跳到下一个文本框

文本框如下: <table> <tr> <td><input type="text" style="width: 150px" id="text6" onkeydown="return changeTab(event,this)"></td> <td><input type="text" style="width: 15

多个input连接在一起的时候如何实现输入一个数字跳入下一个

这个是页面内容  ,我分了12格子,作为一个12位的会员卡号的输入;其实就是12个input我把他们放在了一个div里面  这样配上背景图,看着是一个大的输入框. 1 <div id="AccountNumber" style="position: relative;top: 296px;left: 237px;width: 339px;height: 34px"> 2 <div style="width: 8.33333333%;hei

Scanner类完成用户键盘录入

l  Scanner类 Scanner类是引用数据类型的一种,我们可以使用该类来完成用户键盘录入,获取到录入的数据. Scanner使用步骤: 导包:import java.util.Scanner;  创建对象实例:Scanner sc = new Scanner(System.in);  调用方法:        int  i = sc.nextInt(); 用来接收控制台录入的数字        String s = sc.next(); 用来接收控制台录入的字符串 了解完Scanner类

Java中的引用类型Scanner类和随机类型Random

Scanner类 我们要学的Scanner类是属于引用数据类型,我们先了解下引用数据类型.   引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型 变量名 = new 数据类型(); 每种引用数据类型都有其功能,我们可以调用该类型实例的功能. 变量名.方法名(); Scanner类 Scanner类是引用数据类型的一种,我们可以使用该类来完成用户键盘录入,获取到录入的数据. Scanner使用步骤: //导包: import jav

Scanner类 随机数类Random

引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型  变量名  =  new 数据类型(); 导包:import java.util.Scanner; 创建对象实例:Scanner sc = new Scanner(System.in); 调用方法: int  i = sc.nextInt(); 用来接收控制台录入的数字 String s = sc.next(); 用来接收控制台录入的字符串 了解完Scanner类,我们编写代码来使用下它:ScannerDemo01.java i