将值传递到循环中时遇到麻烦

时间:2019-03-31 23:04:53

标签: java arrays io

如果文本文件由数字行组成,则下面的代码运行得很好,但是一旦到达例如说“我是40”的行,它将跳过它,而不是将40放入数组中。

Scanner inFile = null;
    File file = null;
    String filePath = (JOptionPane.showInputDialog("Please enter a file path"));
    int size = 0;
    int[] result = new int[10];


    try {
        file = new File(filePath);
        inFile = new Scanner(file);
        int skippedCounter = 0;

        for(int i = 0; inFile.hasNext(); i++){
            if(inFile.hasNextInt())
                result[i] = inFile.nextInt();
            else{
                String strOut = "";
                String data = inFile.next();

                for(int j = 0; j <= data.length() - 1; j++){
                    if(!Character.isLetter(data.charAt(j))){
                        strOut += data.charAt(j);
                    }
                    else
                        skippedCounter++;
                }
                result[i] = Integer.parseInt(strOut);
            }
        }
    }

3 个答案:

答案 0 :(得分:0)

next()将为您提供下一个令牌而不是下一行。因此变量i可能会超过10。如果没有空捕获,您将意识到这一点:您的数组超出了范围

解决方案:

不要使用结果数组,请使用结果列表,并在有其他结果时附加到其末尾

注意:

另一个可能发生的隐藏异常是当parseInt由于非数字数据而失败时。因此,不要将所有内容都包装在一个巨大的try / catch中,这只会增加调试的难度!

答案 1 :(得分:0)

我建议您只使用一次nextInt函数来保留请求的值,然后在需要时使用该变量。我认为nextInt函数每次调用时都会移至下一个int。

答案 2 :(得分:0)

以下

result[i] = Integer.parseInt(strOut)
尝试处理任何字母时,

将导致NumberFormatException。由于strOut导致空字符串""

在尝试解析之前,您必须检查一个空的字符串

if (!strOut.isEmpty()) {
    result[i] = Integer.parseInt(strOut);
}