input.nextLine()在程序中起的作用

wang_haijiang 2014-05-17 09:36:04
Scanner input = new Scanner(System.in);

boolean isContinue = true;
do{
try{
System.out.println("Please enter a integer:");
int number = input.nextInt();
System.out.println("The entered number is " + number);
isContinue = false;
}
catch(InputMismatchException e){
System.out.println("again");
input.nextLine();
}
}while(isContinue);

主方法的内容如上,为什么把第十三行input.nextLine()去掉会死循环?
...全文
1077 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
haorengoodman 2014-05-19
  • 打赏
  • 举报
回复
input.nextLine()的作用就是,将 输入流标记位 移动到下一个输入位置。
haorengoodman 2014-05-19
  • 打赏
  • 举报
回复

		Scanner input = new Scanner(System.in);
        boolean isContinue = true;
        do{
            try{
                System.out.println("Please enter a integer:");
                int number = input.nextInt();
                System.out.println("The entered number is " + number);
                isContinue = false;
            }
            catch(InputMismatchException e){
//                System.out.println("33");
//                input.nextLine();
            	Object obj = input.next();
            	System.out.println(obj);
            }
        }while(isContinue);
结果: Please enter a integer: sss sss Please enter a integer://这里阻塞,等待 控制台输入 这个问题确实挺有意思的,分析了一下原因,与楼主分享一下 如果 第6行 抛出异常,执行第13行,根据运行结果看,输入流并没有阻塞在这里等待输入,而是直接打印出:sss 说明第6行出现异常之后,流标记位并没有移动(也就是说 标记位 并没有跳到下一个输入位置),而是仍然停留在原来的位置,所以,第13行 得到的数据仍然是 刚才输入的内容(也就是sss)。 因为每次读入的内容都要 转 int ,有异常出现,说明当前输入 非 数字,则需要跳过这个 “非数字”输入,去读取下一个输入,这样才能避免死循环。如果没有 12 或者 13行,则 输入流 标记位 没有移动到 下一个位置,每次第6行读入的都会是sss,然后试图 将 sss 转 int ,所以就出现死循环。(避免的方法就是,将输入流标记位 跳过 sss ,置到下一个输入位置)
validf9 2014-05-18
  • 打赏
  • 举报
回复
等待用户输入一行
六月心悸 2014-05-18
  • 打赏
  • 举报
回复
nextLine()执行当前行,并返回跳过的输入信息。 此方法返回当前行的其余部分,不包括结尾处的行分隔符。当前位置移至下一行的行首。 因为此方法会继续在输入信息中查找行分隔符,所以如果没有行分隔符,它可能会缓冲所有输入信息,并查找要跳过的行.
什么都不能 2014-05-17
  • 打赏
  • 举报
回复
引用 5 楼 wang_haijiang 的回复:
[quote=引用 4 楼 hanpoyangtitan 的回复:] [quote=引用 3 楼 wang_haijiang 的回复:] [quote=引用 2 楼 hanpoyangtitan 的回复:] 这个循环本来就是个死循环,用nextLine只是做了等待输入,输入后会继续循环,没有nextLine直接进入下次循环。 可以用break;跳出循环。
不好意思,我没说清楚;我理解的这个程序是这样的,在没有input.nextLine()的情况下,首先让我输入一个整数,如果我输入一个3.5,则抛出InputMisMatchException异常,导致boolean值没被改变去处理异常,输出again,然后判断boolean值,依然为真,所以进入第二次循环,number重新被申明,应该让我重新输入值,但是这是却一直循环输出“again;”[/quote] 按照你这样说的是没有问题的,而且我做了验证,也是没有问题的,有图有真相。没有出现死循环。[/quote]
引用 4 楼 hanpoyangtitan 的回复:
[quote=引用 3 楼 wang_haijiang 的回复:] [quote=引用 2 楼 hanpoyangtitan 的回复:] 这个循环本来就是个死循环,用nextLine只是做了等待输入,输入后会继续循环,没有nextLine直接进入下次循环。 可以用break;跳出循环。
不好意思,我没说清楚;我理解的这个程序是这样的,在没有input.nextLine()的情况下,首先让我输入一个整数,如果我输入一个3.5,则抛出InputMisMatchException异常,导致boolean值没被改变去处理异常,输出again,然后判断boolean值,依然为真,所以进入第二次循环,number重新被申明,应该让我重新输入值,但是这是却一直循环输出“again;”[/quote] 按照你这样说的是没有问题的,而且我做了验证,也是没有问题的,有图有真相。没有出现死循环。[/quote] 你是把input.nextLine()去掉后的结果吗?我如果有input.nextLine()和你的结果一样,如果没有就会使这样的:[/quote] 你是要去掉的? 去掉肯定死循环了,每次金循环都会跑到input.nextInt(),这个每次都会报错。 看异常堆栈信息: java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:840) at java.util.Scanner.next(Scanner.java:1461) at java.util.Scanner.nextInt(Scanner.java:2091) at java.util.Scanner.nextInt(Scanner.java:2050) at Test.main(Test.java:10)
wang_haijiang 2014-05-17
  • 打赏
  • 举报
回复
引用 4 楼 hanpoyangtitan 的回复:
[quote=引用 3 楼 wang_haijiang 的回复:]
[quote=引用 2 楼 hanpoyangtitan 的回复:]
这个循环本来就是个死循环,用nextLine只是做了等待输入,输入后会继续循环,没有nextLine直接进入下次循环。
可以用break;跳出循环。

不好意思,我没说清楚;我理解的这个程序是这样的,在没有input.nextLine()的情况下,首先让我输入一个整数,如果我输入一个3.5,则抛出InputMisMatchException异常,导致boolean值没被改变去处理异常,输出again,然后判断boolean值,依然为真,所以进入第二次循环,number重新被申明,应该让我重新输入值,但是这是却一直循环输出“again;”[/quote]
按照你这样说的是没有问题的,而且我做了验证,也是没有问题的,有图有真相。没有出现死循环。[/quote]

引用 4 楼 hanpoyangtitan 的回复:
[quote=引用 3 楼 wang_haijiang 的回复:]
[quote=引用 2 楼 hanpoyangtitan 的回复:]
这个循环本来就是个死循环,用nextLine只是做了等待输入,输入后会继续循环,没有nextLine直接进入下次循环。
可以用break;跳出循环。

不好意思,我没说清楚;我理解的这个程序是这样的,在没有input.nextLine()的情况下,首先让我输入一个整数,如果我输入一个3.5,则抛出InputMisMatchException异常,导致boolean值没被改变去处理异常,输出again,然后判断boolean值,依然为真,所以进入第二次循环,number重新被申明,应该让我重新输入值,但是这是却一直循环输出“again;”[/quote]
按照你这样说的是没有问题的,而且我做了验证,也是没有问题的,有图有真相。没有出现死循环。[/quote]
你是把input.nextLine()去掉后的结果吗?我如果有input.nextLine()和你的结果一样,如果没有就会使这样的:
什么都不能 2014-05-17
  • 打赏
  • 举报
回复
引用 3 楼 wang_haijiang 的回复:
[quote=引用 2 楼 hanpoyangtitan 的回复:]
这个循环本来就是个死循环,用nextLine只是做了等待输入,输入后会继续循环,没有nextLine直接进入下次循环。
可以用break;跳出循环。

不好意思,我没说清楚;我理解的这个程序是这样的,在没有input.nextLine()的情况下,首先让我输入一个整数,如果我输入一个3.5,则抛出InputMisMatchException异常,导致boolean值没被改变去处理异常,输出again,然后判断boolean值,依然为真,所以进入第二次循环,number重新被申明,应该让我重新输入值,但是这是却一直循环输出“again;”[/quote]
按照你这样说的是没有问题的,而且我做了验证,也是没有问题的,有图有真相。没有出现死循环。
wang_haijiang 2014-05-17
  • 打赏
  • 举报
回复
引用 2 楼 hanpoyangtitan 的回复:
这个循环本来就是个死循环,用nextLine只是做了等待输入,输入后会继续循环,没有nextLine直接进入下次循环。 可以用break;跳出循环。
不好意思,我没说清楚;我理解的这个程序是这样的,在没有input.nextLine()的情况下,首先让我输入一个整数,如果我输入一个3.5,则抛出InputMisMatchException异常,导致boolean值没被改变去处理异常,输出again,然后判断boolean值,依然为真,所以进入第二次循环,number重新被申明,应该让我重新输入值,但是这是却一直循环输出“again;”
什么都不能 2014-05-17
  • 打赏
  • 举报
回复
这个循环本来就是个死循环,用nextLine只是做了等待输入,输入后会继续循环,没有nextLine直接进入下次循环。 可以用break;跳出循环。
日知己所无 2014-05-17
  • 打赏
  • 举报
回复
内容概要:本文研究了基于QLearning自适应强化学习的PID控制器在自主水下航行器(AUV)中的应用,通过Matlab代码实现了对水下机器人的动力学建模与运动控制。重点探讨了将强化学习算法QLearning与传统PID控制相结合的方法,以提升AUV在复杂、时变及非线性水下环境中的自适应控制能力。文中系统分析了AUV的运动学与动力学特性,阐述了传统PID参数整定面临的挑战,并提出采用QLearning算法在线动态优化PID控制器的比例、积分和微分参数,从而实现对系统误差、响应速度、超调量等性能指标的综合优化。通过Matlab仿真实验验证了该复合控制策略在轨迹跟踪精度、抗外部干扰能力和系统鲁棒性方面的显著优势,充分展示了强化学习在智能水下装备自主控制领域的可行性和应用潜力。; 适合人群:具备自动控制理论基础、强化学习基础知识及Matlab编程能力的研究生、科研人员和自动化、海洋工程、机器人等相关领域的技术研发人员。; 使用场景及目标:①用于水下机器人、无人潜航器等智能移动装备的高精度运动控制系统设计与开发;②开展强化学习与经典控制理论融合创新的教学案例与科学研究;③解决传统固定参数PID控制器在面对模型不确定性和环境扰动时适应性差、控制性能下降的关键问题。; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,重点关注QLearning算法中状态空间、动作空间的设计逻辑以及奖励函数的构建原则,深入理解其在参数寻优过程中的作用机制,并可通过调整环境参数和初始条件来测试算法的鲁棒性与泛化能力。
内容概要:本文以有源中点箝位(ANPC)三电平并网逆变器为研究对象,提出并构建了一套融合双极性倍频脉宽调制(DPWMA)、正负序分离锁相控制与电网电压前馈的一体化高性能并网控制策略。通过深入分析ANPC三电平拓扑在开关损耗均衡、中点电位可控性及输出谐波低等方面的结构优势,确立了其作为大功率高质量并网系统的硬件基础。在此基础上,DPWMA调制策略有效提升等效开关频率,显著降低输出电流电压的总谐波畸变率,优化稳态电能质量;正负序分离锁相技术精准剥离电网电压中的负序扰动分量,保障电网不平衡工况下的相位同步精度与并网电流对称性;电网电压前馈控制则通过前瞻性补偿机制,突破传统闭环控制的响应滞后瓶颈,大幅提升系统在电压骤变、畸变等动态扰动下的抗扰能力与动态响应速度。研究通过搭建完整的Simulink仿真模型,在稳态对称、电网不平衡及动态切换等多种工况下进行全面验证,结果表明该复合控制策略在电能质量、运行稳定性与工况适应性方面均具有显著优越性。; 适合人群:具备电力电子、自动控制或新能源并网等相关专业背景,从事科研、工程开发或处于研究生及以上学习阶段的专业技术人员。; 使用场景及目标:①应用于光伏发电、风力发电等新能源系统的大功率并网逆变器高性能控制设计;②解决电网电压不平衡、畸变等复杂非理想工况下的并网稳定性与电能质量问题;③提升工业级并网设备的动态响应速度与运行可靠性;④为相关领域的仿真建模、控制算法开发与性能优化提供系统性的技术参考与实现方案。; 阅读建议:建议结合文中所述的Simulink仿真模型进行实践操作,重点深入理解DPWMA调制的具体实现逻辑、正负序分离锁相环的设计原理以及前馈-反馈复合控制结构的集成方法,通过设置不同工况的对比仿真实验,直观体会各项关键技术对系统整体性能的提升作用

62,622

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧