我有一个由数字组成的data.txt文件
12 45 345 500 45.67684 33

一旦执行readData方法,它应该只打印整数值,并且print元素对任何其他类型都无效,然后像这样继续

readData(“ data.txt”)将
打印出以下内容:
12 45345500元素无效33

我的问题是,一旦打印出元素无效语句,我的代码就不会继续打印33,它只会停在12 45 345 500元素无效处

import java.io.*;
import java.util.*;

public class Ex7 {

    public static void readData(String nameFile){

       try{
        BufferedReader br = new BufferedReader(new FileReader(nameFile));
        String line = br.readLine();
        int i = 0;

         while((line != null)){
            try{
            String[] lines = line.split(" ");
            int[] result = new int[lines.length];
            result[i] = Integer.parseInt(lines[i]);

            if(result[i] ==(int)result[i]){
               System.out.print(result[i] + " ");
            }
            i++;
        }

       }
        }catch(NumberFormatException e){
            System.out.println("element not valid " );
         }catch(IOException e){
          System.out.println("IO error");
          System.exit(0);
        }
    }

    public static void main (String[] args){
        readData("data.txt");
    }
}

最佳答案

您提出问题的原因是您不了解所发生的控制流程。

这很简单:您有一个循环读取文件。但是您的收获不在那个循环之内。因此,当有东西抛出,而您“捕捉”到循环外时,该循环就“结束了”。没有办法回来。

因此,直接的答案是:将NumberFormatException ...的try / catch移到实际发生的地方。

try {
  result[i] = Integer.parseInt(lines[i]);
 } catch (NumberFormatException ...


但是,当然……这直接导致代码的下一个问题:您正在使用数组存储“有效”输入……数组的大小是固定的。您如何事先知道有效的会员人数?你不知道因此:您必须从使用数组更改为动态列表,例如ArrayList。现在,您只需添加“有效”行。但是,那实际上并不重要。因为您的方法不返回收集的值。但是,如果不使用数据;首先收集它是没有意义的。

除了必须进行代码更改外,答案还包括:回到书本上;并了解您正在使用的构造/概念如何实际工作。盲目地输入try / catch是没有意义的,仅仅是因为它们出现在某个地方,或者是因为您的IDE告诉您某种程度上需要对异常进行处理。含义:当您写下代码时,请确保您确实真正了解该代码在做什么。您知道,就像其他语句if (result[i] == (int) result[i]) ...永远都是正确的;而且根本没有任何意义。

10-04 14:10