Scanner迷之操作

Scanner对象的迷之操作

最近参加了一些笔试,大都都是要通过标准输入来获取数据的,使用java写算法题,那我们首先就会想到使用Scanner对象,但是我coding完发现,总是编译不成功,一直报数组越界等等问题,我就检查呀检查,改呀改,还是越界,我这暴脾气.....没办法,看着考试的时间一点一点的过去,到最后我也没能成功提交。

重新自己写了一遍,发现还是有问题,我才开始考虑(这猪脑子),会不会不是因为算法部分的问题,而是获取数据的问题,我开始调试终于发现了问题的所在,我写了如下代码

public static void main(String []args){
    Scanner input = new Scanner(System.in);
    int n = input.nextInt();//1
    String str = input.nextLine();//2
}

上面1和2两处就出现了问题,当获取到了整数n之后,下一行的字符串无法获取,似乎就直接跳过了这行代码。

其实并没跳过:

nextInt()方法读取数据的规则是,遇到 enter 或者 空白(即空格) 结束读取<这里空白字符只是结束读取,其实nextInt()还没结束执行,所以我们还可以在控制里输入>,但是enter字符和空白字符(包含) 后面的数据都不会读取,将他们一起保留在了缓冲区内;而后面我们紧接着使用nextLine(),它的读取规则是读取遇到的第一个enter字符前的所有输入,enter字符也会读进去,而前面的nextInt()将enter字符流在了缓冲区,所以nextLine()直接就读取到了enter,还没等我们输入数据就结束了nextLine()的执行。这也就导致了读取数据存在了极大的问题。

nextDouble()与nextInt()也会出现同样的情况。

解决办法

1. 在nextInt()与nextLine()的中间多执行以下nextLine(),让中间的nextLine()把enter读取掉(跳过)即可。

public static void main(String []args){
    Scanner input = new Scanner(System.in);
    int n = input.nextInt();
    input.nextLine();
    String str = input.nextLine();//2
}

2. 不使用nextInt()方法,全都使用nextLine()来读取数据,做一个数据转换就可以了

public static void main(String []args){
    Scanner input = new Scanner(System.in);
    int n = Integer.parseInt(input.nextLine());
    String str = input.nextLine();
}
package bore; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.Scanner; public class DVDMgr { public DVDSet[] dvds = new DVDSet[3]; public static void main(String[] args) { DVDMgr dm = new DVDMgr(); dm.intital(); dm.startMenu(); } /** * 启动目录 */ public void startMenu() { System.out.println("欢 迎 使 用 你 DVD 管 理 器"); System.out.println("-------------------------------------"); System.out.println("1. 新 增 DVD"); System.out.println("2. 查 看 DVD"); System.out.println("3. 删 除 DVD"); System.out.println("4. 借 出 DVD"); System.out.println("5. 归 还 DVD"); System.out.println("6. 退 出 "); System.out.print("--------------------------------------\n"); System.out.print("请选择: "); Scanner input = new Scanner(System.in); int choice = input.nextInt(); switch(choice){ case 1: System.out.println("此处实现新增DVD "); add(); System.out.println("**************************"); returnMain(); break; case 2: System.out.println("此处实现查看DVD "); search(); System.out.println("**************************"); returnMain(); break; case 3: System.out.println("此处实现删除DVD "); del(); System.out.println("**************************"); returnMain(); break; case 4: System.out.println("此处实现借出DVD "); lend(); System.out.println("**************************"); returnMain(); break; case 5: System.out.println("此处实现归还DVD "); try { relend(); } catch (ParseException e) { e.printStackTrace(); } System.out.println("**************************"); returnMain(); break; case 6: System.out.println("\n谢谢 使 用!"); break; }
07-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莽晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值