当前位置: 代码迷 >> J2SE >> 为什么scanner 抛出错误后就一直在这循环
  详细解决方案

为什么scanner 抛出错误后就一直在这循环

热度:143   发布时间:2016-04-24 02:32:04.0
为什么scanner 抛出异常后就一直在这循环啊
import java.io.*;
import java.util.InputMismatchException;
import java.util.Scanner;

public class basicType {

/**
* @param args
*/

public static void S_equals()
{
String s1="abc",s2="abc";
System.out.println("s1 equals s2 is "+s1.equals(s2));
System.out.println("s1 equals \"abc\" is "+s1.equals("abc"));
System.out.println("\"abc\" equals \"abc\" is "+"abc".equals("abc"));
}

public static void N_scan()
{
int sum=0;
Scanner input=new Scanner(System.in);
System.out.print("input 10 interger number:");
for(int i=0;i<10;i++)
{
int m=0;
try{
m=input.nextInt();
}
catch(InputMismatchException e) //一直在这个地方循环 求解释啊
{
i--;
} sum+=m;
}
System.out.println("sum of the 10 Intergers is:"+sum);
}

public static void main(String[] args) {
// TODO Auto-generated method stub
S_equals();
N_scan();
}

}


------解决方案--------------------
你想要用户一次性输出10个数么?那你现在的逻辑肯定是错误的啊

先给你一个一次输入10个数的吧,10个数输入的时候按照逗号分隔
Java code
import java.io.*;import java.util.InputMismatchException;import java.util.Scanner;public class BasicType {    public static void S_equals()    {        String s1="abc",s2="abc";        System.out.println("s1 equals s2 is "+s1.equals(s2));        System.out.println("s1 equals \"abc\" is "+s1.equals("abc"));        System.out.println("\"abc\" equals \"abc\" is "+"abc".equals("abc"));    }    public static void N_scan()    {        int sum=0;        Scanner scanner=new Scanner(System.in);        System.out.print("input 10 interger number like 1,2,3 ...");        String inputStr=scanner.next();        String[] numStr=inputStr.split(",");        for(String s:numStr){             int value=Integer.parseInt(s);             sum=sum+value;        }//        for(int i=0;i<10;i++)//        {//            int m=0;//            try{//                m=input.nextInt();//            }//            catch(InputMismatchException e) //一直在这个地方循环 求解释啊//            {//                i--;//            }//            sum+=m;//        }        System.out.println("sum of the 10 Intergers is:"+sum);    }    public static void main(String[] args) {// TODO Auto-generated method stub        S_equals();        N_scan();    }}
------解决方案--------------------
try{
 m=input.nextInt();
 }
 catch(InputMismatchException e) //一直在这个地方循环 求解释啊
{
i--;
 }sum+=m;
在sum += m;前少个" ; "
加上就可以了
try{
 m=input.nextInt();
 }
 catch(InputMismatchException e) //一直在这个地方循环 求解释啊
{
i--;
 };
sum+=m;

------解决方案--------------------
Scanner是使用分隔符模式将其输入分解为标记的,所以当你输入的标记与期望类型的模式不匹配时,就会发生InputMismatchException异常,在你程序的for循环中,如果发生一次异常,下次还是会发生异常,以为你的input对象还是发生异常的那个对象;至于为什么会一直循环,那是因为当异常发生时你程序i--,这样正好和for循环的i++抵消,成了死循环。我对你程序中i--的理解是:当输入字符与期望类型的模式不匹配时,重新输入,直到输入类型匹配字符。所以下面是程序的修改:
Java code
for (int i = 0; i < 10; i++) {            int m = 0;            try {                m = input.nextInt();            } catch (InputMismatchException e) // 一直在这个地方循环 求解释啊            {                input = new Scanner(System.in);//当发生异常时,new一个新的Scanner对象                i--;            }            sum += m;        }
  相关解决方案