日期:2014-05-20  浏览次数:20732 次

为什么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;
        }