Java 遍历一个txt文件并查找整数和(异常)

Java 遍历一个txt文件并查找整数和(异常),java,exception,Java,Exception,我有一个程序,它可以询问用户什么是txt文件,遍历txt文件,找到所有可解析的整数并求平均值。我有下面的代码,但它给了我一大堆错误。所有这些错误的原因是什么 txt文件是: 5. 15 312 16 8744 捌万伍仟零陆拾贰元壹角398分 九十三 如果查看JavaDoc的,您会发现它“构造了一个新的扫描器,生成从指定字符串扫描的值。”您需要的是“…一个新的扫描器,生成从指定文件扫描的值” 不要使用Do while,如果文件没有任何整数,它将通过空指针。用while代替。另外,不要初始化循环中的

我有一个程序,它可以询问用户什么是txt文件,遍历txt文件,找到所有可解析的整数并求平均值。我有下面的代码,但它给了我一大堆错误。所有这些错误的原因是什么

txt文件是: 5. 15 312 16 8744 捌万伍仟零陆拾贰元壹角398分 九十三


如果查看JavaDoc的,您会发现它“构造了一个新的扫描器,生成从指定字符串扫描的值。”您需要的是“…一个新的扫描器,生成从指定文件扫描的值”

不要使用Do while,如果文件没有任何整数,它将通过空指针。用while代替。另外,不要初始化循环中的任何变量。这将导致它们在每次迭代时重新初始化

file.nextInt()的要点是什么在您的catch块中?它使程序跳过一个额外的整数。移除它。此外,不要调用
input.close()
中,您不想关闭系统

    @SuppressWarnings("resource")
    Scanner input = new Scanner(System.in);
    System.out.println("Enter filename: ");
    File file = new File(input.nextLine());

    /*
     * Check file existence before constructing your scanner. This will prevent a
     * FileNotFoundException. Notice, I used File#exists and the NOT operator '!'
     */
    if (!file.exists()) {
        System.err.println("Could not find file: " + file.getName());
        System.exit(0);
    }

    Scanner scanner = new Scanner(file);

    // Initialize variables outside of loop.
    int num = 0;
    int total = 0;
    int count = 1;
    // No do-while
    while (scanner.hasNextInt()) {
        try {
            num = scanner.nextInt();
            total += num;

            // Display the results
            System.out.println("The number of parsable numbers: " + count);
            System.out.println("Average values: " + (total / count));

            // count is pointless unless you increase it after every number.
            count++;
        } catch (NumberFormatException ex) {
            System.out.println("Cannot parse " + num + " as an integer.");
        }

    }

    // Close the files
    scanner.close();

最后,正如Mad程序员指出的,“八七”和“八万五千六百二十二”不是数字,因此
Scanner\nextInt
将不包括它们。一个解决方法是相应地使用和解析。类似这样的情况:

您的代码完全错了。我已经修改过了,现在可以用了

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;


public class Ch12Pt2 {
    public static void main(String[] args) throws NumberFormatException, FileNotFoundException {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter filename: ");
        String filename = input.nextLine();
        Scanner file = new Scanner(new FileReader(filename));
        int num =0;
        int count =0;
        int total =0;

        if(file.nextLine().equals(""))
        {
            System.err.println("Could not find file:" + filename);
            System.exit(1);
        }

        while (file.hasNextInt()){
            try {
                    num = file.nextInt();
                    total = num + total;
                   count++;


            }
            catch (NumberFormatException ex) {
                System.out.println("Cannot parse " + num + " as an integer.");
            }

        }

// Close the files
        input.close();
        file.close();
        System.out.println("The number of parsable numbers: " + count);
        System.out.println("Average values: " + (total / count));
    }

}
扫描仪文件=新扫描仪(文件名)

线程“main”java.util.NoSuchElementException中出现异常

如果使用扫描仪从文本文件读取数据,则需要指定文件,而不是字符串,这就是出现上述错误的原因

使用:

然后递归地遍历文本文件,如下所示:

while(scanner.hasNext())
您的代码:

while(file.hasNextInt())

将不起作用,因为当遇到除整数以外的任何内容时,hasNextInt()方法将停止处理文本文件

System.out.println(“无法将“+num+”解析为整数。”)

变量num是在处理异常的主体的不同范围内定义的。由于NumberFormatException主体中未定义num,将引发其他错误

txt文件是:5153216168744850000622 139893

如果文本文件中的项目在同一行上,最好使用split方法获取所有元素,然后检测它们是否为数字

String line = sc.nextLine();
String elements = line.split(" ");
for (String e : elements) {
 // add if int, or continue iteration
}
否则,请尝试以下方法:

int sum = 0;
int numElements = 0;
Scanner scanner = new Scanner(new FileReader("path-to-file"));
while (scanner.hasNext()) {
    try {
      int temp = Integer.parseInt(sc.nextLine());
      sum += temp;
      numElements += 1;
    }catch(NumberFormatException e) {
      continue;
    } 
}

System.out.println("Mean: "+ (sum/numElements));

eight
不是
int
,因此
file.nextInt()
将fail@MadProgrammer我认为NumberFormatException会控制它。
java.util.NoSuchElementException
不是从
NumberFormatException
或任何公共祖先扩展而来,所以我也不会理解它,
扫描仪文件=新扫描仪(文件名)
不正确,这是将
字符串
文件名
传递给要处理的
扫描仪
,而您可能指的是
扫描仪文件=新扫描仪(新文件(文件名))它将实际读取指定的文件我可以看出您是新的。这里让我给你一些建议。永远不要把密码交给别人。相反,解释他们犯了什么错误,为什么是错误(如果可以的话),以及你到底是如何纠正的。明白了。谢谢你的建议。他密码里的每一件事都是错的,所以我想帮助他。下次仍将记住它。“…hasNextInt()方法在遇到除整数以外的任何内容时将停止处理文本文件。”事实并非如此。如果输入系统中还有任何整数,它将返回true。您应该正确引用。“Lord Why”包含了来自OPs代码的
,而他是对的,如果下一个标记不是
int
,它将停止处理/循环。但是你的句子“如果输入中还有整数,它将返回true”是错误的。该方法检查下一个标记,而不是输入流上留下的任何标记。实际上,不,只有当输入流中的下一组字符可以读取为int类型时,它才会返回true。根据官方Javadoc,“如果可以使用nextInt()方法将此扫描仪输入中的下一个标记解释为默认基数中的int值,则返回true。”
String line = sc.nextLine();
String elements = line.split(" ");
for (String e : elements) {
 // add if int, or continue iteration
}
int sum = 0;
int numElements = 0;
Scanner scanner = new Scanner(new FileReader("path-to-file"));
while (scanner.hasNext()) {
    try {
      int temp = Integer.parseInt(sc.nextLine());
      sum += temp;
      numElements += 1;
    }catch(NumberFormatException e) {
      continue;
    } 
}

System.out.println("Mean: "+ (sum/numElements));