使用Scanner时nextLine()抛出InputMismatchException而next()无异常的原因
问题:Scanner使用nextLine()获取coach时抛出InputMismatchException的原因
在以下Java代码中,输入coach值并按下回车后,Scanner会抛出InputMismatchException,但改用sc.next()获取coach则不会出现该异常。原本预期两种方式都不会抛出异常,现明确原因如下:
void accept() { System.out.println("Enter name , mobile number and coach for the customer and also the amount of ticket."); name=sc.nextLine(); mobno= sc.nextLong(); coach=sc.nextLine(); amt=sc.nextInt(); }
原因解析
nextLong()、nextInt()这类针对基本数据类型的Scanner方法,只会读取对应类型的有效内容,不会读取输入末尾的换行符,这个换行符会残留在输入缓冲区中。- 具体执行流程:
- 执行
name=sc.nextLine();时,会读取用户输入的姓名及末尾的回车,同时清空缓冲区里的换行符。 - 执行
mobno=sc.nextLong();时,用户输入手机号后按回车,该方法只读取数字部分,把末尾的换行符留在了缓冲区。 - 执行
coach=sc.nextLine();时,该方法会直接读取缓冲区中残留的换行符,相当于获取了一个空字符串,此时用户实际输入的coach值还在缓冲区里。 - 后续执行
amt=sc.nextInt();时,该方法尝试把缓冲区里的coach字符串(比如"A"、"B"这类非数字内容)转换成整数,因此抛出InputMismatchException。
- 执行
- 改用
sc.next()时,next()方法会自动跳过开头的空白(包括残留的换行符),然后读取到下一个空白(用户输入coach后按的回车)之前的内容,能正确获取coach值,后续nextInt()也能正常读取金额数字,不会触发异常。
内容的提问来源于stack exchange,提问作者Programmer AHN
相关产品推荐
相关产品推荐

