使用java扫描程序的无限循环

时间:2014-12-18 07:08:56

标签: java java.util.scanner

我在使用扫描仪输入int时遇到问题。在getInputs方法中,如果我不包含if(in.hasNextInt())...我得到错误:

 Exception in thread "main" java.util.NoSuchElementException
 at java.util.Scanner.throwFor(Scanner.java:907)
 at java.util.Scanner.next(Scanner.java:1530)
 at java.util.Scanner.nextInt(Scanner.java:2160)
 at java.util.Scanner.nextInt(Scanner.java:2119)
 at Solution.getInputs(Solution.java:30)
 at Solution.main(Solution.java:7)   

然而,随着包含这一行,我陷入无限循环,因为尽管我多次在控制台中输入一个数字,但它永远不会评估是否存在int所以int n永远不会改变值。我试过搜索,每个人都说要使用if(in.hasNextInt())但是找不到破解无限循环的解决方案。我迷路了,无法理解。我已经尝试过conditioninig

while(in.hasNextInt()) {
  n = in.nextInt();
  if (n > 0) break;
}

但这只是跳过循环。老实说,我迷路了。

 import java.util.*;

 public class Solution{

    public static void main(String[] args) {
        int t = getTestCases();
        int[] inputs = getInputs(t);
        int[] solutions = getSolutions(inputs);
        for (int i = 0; i < solutions.length; i++) {
            System.out.println(solutions[i]);
        }
    }

    static int getTestCases() {
        int t = getNumber();
        while(t <= 0 && t > 15) {
            t = getNumber();
        }
        System.out.println("t = " + t);
        return t;
    }

    static int[] getInputs(int t) {
        int[] inputs = new int[t];
        for (int i = 0; i < t; i++) {
            int n = getNumber();
            while (n <= 0) {
                n = getNumber();
            }
            inputs[i] = n;
        }
        return inputs;
    }

    static int[] getSolutions(int[] inputs) {
        int[] solutions = new int[inputs.length];
        for (int i = 0; i < solutions.length; i++){
            solutions[i] = findDigits(inputs[i]);
        }
        return solutions;
    }

    static int findDigits(int n) {
        int total = 0;
        String str = "" + n;
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            int d = Character.getNumericValue(ch);
            if (d != 0) {
                if (n % d == 0)  total++;
            }
        }
        return total;
    }

    static int getNumber() {
        Scanner in = new Scanner(System.in);
        int n = -1;
        if(in.hasNextInt()) n = in.nextInt();
        in.close();
        return n;
    }
}

1 个答案:

答案 0 :(得分:1)

为什么每次循环都要创建和关闭扫描仪?

在方法开头创建一个扫描仪,并在返回之前关闭它。那应该是你排除。

static int[] getInputs(int t) {
    Scanner in = new Scanner(System.in);
    int[] inputs = new int[t];
    for (int i = 0; i < t; i++) {
        int n = 0;
        while (n <= 0) {
            if (in.hasNextInt()) n = in.nextInt();
        }
        inputs[i] = n;
    }
    in.close();
    return inputs;
}