java 输入流异常处理并重新输入,无限循环抛异常问题处理
2016-08-03 16:44
537 查看
最近发现了一个问题,使用Scanner输入流时,如果做了异常处理,nextInt输入有误抛出异常时,循环在次输入会出现无限循环抛出异常,直至栈溢出,程序崩掉。这是什么原因呢?
Scannersc=newScanner(System.in);
booleanflag=true;
System.out.println("请输入您需要的信息:");
while(flag){
try{
intnumber=sc.nextInt();
}catch(Exceptione){
System.out.println("您的输入有误,请重新输入");
e.printStackTrace();
}
}
通过查资料解决了这个问题,这是由于Scanner接受键盘输入信息的机制所造成的后果:
Scanner在接受键盘输入时,在内存中会有一段专门用来接收键盘输入的信息。键盘信息输入内存以后与你定义的接收输入的类型匹配,如果不匹配会抛出异常,但是键盘输入的信息会停留在内存当中,当下次需要输入时直接读取该内存存在的值,继续抛出异常,导致无限循环。这种情况的解决方法有三种:
1. 在try catch块中,异常处理时,声明一个sc.next();这一句话的作用是读取一次内存中的内容,这样等待键盘输入内存中的数据被清空,下一次可以输入
Scannersc=newScanner(System.in);
booleanflag=true;
System.out.println("请输入您需要的信息:");
while(flag){
try{
intnumber=sc.nextInt();
}catch(Exceptione){
System.out.println("您的输入有误,请重新输入");
sc.next();
e.printStackTrace();
}
}
}
2. 每次使用Scanner之前,new Scanner(SyStem.in);也能解决问题,但是这样做非常的消耗性能。
while(flag){
try{
sc=newScanner(System.in);
intnumber=sc.nextInt();
break;
}catch(Exceptione){
System.out.println("您的输入有误,请重新输入");
//sc.next();
e.printStackTrace();
}
}
3. 每一个输入都使用nextLine();接收输入后,对接收的数据进行类型的强制转换。类型无法转换会抛出异常
while(flag){
try{
Stringstr=sc.nextLine();
intnumber=Integer.parseInt(str);
break;
}catch(Exceptione){
System.out.println("您的输入有误,请重新输入");
//sc.next();
e.printStackTrace();
}
}
Scannersc=newScanner(System.in);
booleanflag=true;
System.out.println("请输入您需要的信息:");
while(flag){
try{
intnumber=sc.nextInt();
}catch(Exceptione){
System.out.println("您的输入有误,请重新输入");
e.printStackTrace();
}
}
通过查资料解决了这个问题,这是由于Scanner接受键盘输入信息的机制所造成的后果:
Scanner在接受键盘输入时,在内存中会有一段专门用来接收键盘输入的信息。键盘信息输入内存以后与你定义的接收输入的类型匹配,如果不匹配会抛出异常,但是键盘输入的信息会停留在内存当中,当下次需要输入时直接读取该内存存在的值,继续抛出异常,导致无限循环。这种情况的解决方法有三种:
1. 在try catch块中,异常处理时,声明一个sc.next();这一句话的作用是读取一次内存中的内容,这样等待键盘输入内存中的数据被清空,下一次可以输入
Scannersc=newScanner(System.in);
booleanflag=true;
System.out.println("请输入您需要的信息:");
while(flag){
try{
intnumber=sc.nextInt();
}catch(Exceptione){
System.out.println("您的输入有误,请重新输入");
sc.next();
e.printStackTrace();
}
}
}
2. 每次使用Scanner之前,new Scanner(SyStem.in);也能解决问题,但是这样做非常的消耗性能。
while(flag){
try{
sc=newScanner(System.in);
intnumber=sc.nextInt();
break;
}catch(Exceptione){
System.out.println("您的输入有误,请重新输入");
//sc.next();
e.printStackTrace();
}
}
3. 每一个输入都使用nextLine();接收输入后,对接收的数据进行类型的强制转换。类型无法转换会抛出异常
while(flag){
try{
Stringstr=sc.nextLine();
intnumber=Integer.parseInt(str);
break;
}catch(Exceptione){
System.out.println("您的输入有误,请重新输入");
//sc.next();
e.printStackTrace();
}
}
相关文章推荐
- Java调试的重要,异常处理中输入异常处理问题
- Java通过while循环实现输入异常重新输入功能
- 关于JAVA的Scanner(System.in)循环输入的一些问题与解决
- 【JAVA】【问题】异常处理中的exception
- java处理Process输入流阻塞问题
- java学习——输入作为异常处理的理解
- Java - 异常处理的六个问题
- 学习java异常处理是出现Exception文件找不到问题
- Java:多重循环for、while、do-while(简单判断是否是四位整数、1-100累加,水仙花、最大公约数。最小公倍数、完数、输入任意数计算每位数之和、弹力球问题)
- java中有关异常处理的问题
- try异常处理与Scanner循环问题
- JAVA问题总结之26-异常处理
- Java异常处理中同时有finally和return语句的执行问题
- JAVA 多态和异常处理作业——动手动脑以及课后实验性问题
- 自己做的demo---关于java控制台输入跟类型转化跟处理异常的demo
- Java异常处理--将try/catch区段置于循环之外
- Java异常处理--将try/catch区段置于循环之外
- Java异常处理的注意问题
- java 重新抛出异常 相关处理结果示例代码
- Java异常处理问题