有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在解析文本文件输入时不会移动到下一行

我在寻求一点帮助。我用谷歌搜索了很多次,但几乎没有成功

我是编程新手,我确信这是我一个愚蠢的疏忽

下面的代码旨在通读。以制表符分隔的txt文档。这个txt文件被格式化为六列。目前,当我在文件中移动时,我将字符串解析为适当的值类型,并将其分配给相应的变量。代码如下:

        try {
            s = new Scanner(new BufferedReader(new FileReader(file))).useDelimiter("\t");
            while (s.hasNextLine()) {
              group = Integer.parseInt(s.next());
              death = Integer.parseInt(s.next());
              name = s.next();
              sex = s.next();
              age = Integer.parseInt(s.next());
              fare = Double.parseDouble(s.next());
              System.out.println("Class = " + group); // Test that value is being assigned
              System.out.println("Death = " + death); // Test that value is being assigned
              System.out.println("Name = " + name); // Test that value is being assigned
              System.out.println("Gender = " + sex); // Test that value is being assigned
              System.out.println("Age = " + age); // Test that value is being assigned
              System.out.println("Fare = " + fare); // Test that value is being assigned
           }
        } finally {
            if (s != null) {
               s.close();
            }
        }

当我到达第一行的最后一列时,可变票价设置为第1行第6列和第2行第1列。由于某些原因,换行符不会触发while循环重新启动

有人能帮我理解为什么while循环不能在线路的末尾重新启动吗

文件如下所示:

1     5     Bryan     male     25     211.3375       
1     2     Jimmy     male     22     151.5500

大约有1200行。当运行这个循环时,在第一行末尾尝试设置fare=211.3375时,我得到以下错误。由于某些原因,换行符不会重置循环。我只能假设换行符没有被解释为制表符,但不知道如何更正

Exception in thread "main" java.lang.NumberFormatException: For input string: "211.3375 1"


共 (1) 个答案

  1. # 1 楼答案

    你正在检查Scanner#hasNextLine(),但随后阅读了多个Scanner#next(),这是一件危险的事情。我建议如果你检查下一行,你应该阅读下一行,然后分析这一行

    例如

    while (s.hasNextLine()) {
        String line = s.nextLine();
        Scanner lineScanner = new Scanner(line);
        group = lineScanner.nextInt();
        death = lineScanner.nextInt();
        name = lineScanner.next();
        sex = lineScanner.next();
        age = lineScanner.nextInt();
        fare = lineScanner.nextDouble();
        lineScanner.close();
        System.out.println("Class = " + group); // Test that value is being assigned
        System.out.println("Death = " + death); // Test that value is being assigned
        System.out.println("Name = " + name); // Test that value is being assigned
        System.out.println("Gender = " + sex); // Test that value is being assigned
        System.out.println("Age = " + age); // Test that value is being assigned
        System.out.println("Fare = " + fare); // Test that value is being assigned
    }
    

    但即使这样也有点危险,因为我没有先检查就给Scanner#next...()打电话了。所以也许更安全的做法是这样做

    String[] tokens = line.split("\\s+");
    

    然后计算令牌的长度以确保其正确,然后将每个需要解析为数字类型的令牌解析为数字类型

    或者你可以这样做:

    while (s.hasNextLine()) {
        String line = s.nextLine();
        Scanner lineScanner = new Scanner(line);
    
        if (lineScanner.hasNextInt()) {
            group = lineScanner.nextInt();
        }
        if (lineScanner.hasNextInt()) {
            death = lineScanner.nextInt();
        }
        if (lineScanner.hasNext()) {
            name = lineScanner.next();
        }
        if (lineScanner.hasNext()) {
            sex = lineScanner.next();
        }
        if (lineScanner.hasNextInt()) {
            age = lineScanner.nextInt();
        }
        if (lineScanner.hasNextDouble()) {
            fare = lineScanner.nextDouble();
        }
        lineScanner.close();
    
        System.out.println("Class = " + group); // Test that value is being assigned
        System.out.println("Death = " + death); // Test that value is being assigned
        System.out.println("Name = " + name); // Test that value is being assigned
        System.out.println("Gender = " + sex); // Test that value is being assigned
        System.out.println("Age = " + age); // Test that value is being assigned
        System.out.println("Fare = " + fare); // Test that value is being assigned
    }
    

    或者使用try/catch块检查坏文件