当我没有填写arraylist中对象的所有值时,如何防止我的java代码给我一个错误消息?

时间:2016-02-05 05:17:45

标签: java arraylist

我正在尝试创建一个程序,该程序可以读取文本文件并根据数据(以及其他内容)创建对象的arraylist。大多数文本非常直接,由两个双数组成,如下所示:
    454.56 3.4
    3321.7 .0023
但是,一些文本行最后缺少一个数字,只包含一个这样的双数:
    3222.5
这是我到目前为止的代码的简化版本:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class objectGenerator {
    public double firstDouble;
    public double secondDouble;

    objectGenerator(double 1, double 2) {
        firstDouble = 1;
        secondDouble = 2;
    }

    public static void main(String[] args) {

        String fileName = "data.txt";
        Scanner inputStream = null;
        try {
            inputStream = new Scanner(new File(fileName));
        } catch (FileNotFoundException e) {
            System.out.println("Error opening the file " +
                    fileName);
            System.exit(0);
        }

        List<objectGenerator> objects = new ArrayList<objectGenerator>();
        while (inputStream.hasNextLine()) {
            String line = inputStream.nextLine();
            String[] data = line.split(" ");
            objectGenerator object = new objectGenerator(Double.parseDouble(data[0]), Double.parseDouble(data[1]));
            objects.add(object);
        }
        inputStream.close();
        //example text file
        //544.7 7.4
        //34.5 

    }

}

运行以下代码将产生错误消息,因为文本文件在第二行末尾缺少double。我不确定如何解决这个问题,并感谢我能得到的任何帮助。

作为旁注,如果有一些方法可以让我在填充arraylist时填写文本文件留下的空白区域的默认值,这将是非常有益的。我将使用的最终文本文件可能包含数百行代码,因此如果在创建对象时有一种方法为所有空格填充默认值,那将会很好。

2 个答案:

答案 0 :(得分:1)

以下是重构while循环的方法:

static final double DEFAULT_DATA = -1d;   // replace with your desired default value

while (inputStream.hasNextLine()) {
    String line = inputStream.nextLine();
    String[] data = line.split(" ");

    objectGenerator object = null;

    if (data.length == 1 && data[0].equals("")) {  // empty line
        object = new objectGenerator(DEFAULT_DATA, DEFAULT_DATA);
    }
    else if (data.length == 1) {                   // only one number
        object = new objectGenerator(Double.parseDouble(data[0]), DEFAULT_DATA);
    }
    else {                                           // two numbers
        object = new objectGenerator(Double.parseDouble(data[0]),
                                     Double.parseDouble(data[1]));
    }

    // you may want to check if (object == null) here to cover any weird edge cases
    objects.add(object);
}

顺便说一下,Java命名约定规定类名的第一个字母应该出现在大写中。因此,我会将您的班级名称更改为ObjectGenerator,并使用大写O

答案 1 :(得分:0)

为您的objectGenerator

创建重载的构造函数
objectGenerator(double a){
    this(a, 0);
}

objectGenerator(double a, double b){
    firstDouble = a;
    secondDouble = b;
}

我假设如果在文本文件中找不到secondDouble值为零

现在您可以像这样创建objectGenerator

objectGenerator object = new data.length == 1 ? objectGenerator(Double.parseDouble(data[0])) : new objectGenerator(Double.parseDouble(data[0]),Double.parseDouble(data[1])) ;

如果您使用的是java 8
您可以使用可变参数

创建构造函数
objectGenerator(double...arr){
    firstDouble = arr[0];
    secondDouble = arr.length > 1 ? arr[1] : 0;
}