线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常:1。之前我得到了这个

时间:2017-01-30 08:31:40

标签: java runtime runtime-error

似乎指向loadDogs();和项目[1],但我没有看到任何问题。以前使用相同的代码工作,然后我开始出现这些错误。我以前支持过这个代码,但是当我使用备份代码时;结果仍然存在。我试着修了一个小时,但它没有消失。它编译虽然运行它会抛出eclipse中的错误。

    public class DogCompetitionManager     {
    private final String DOGS_FILE = "res/dogs.txt";
    private final String COURSE_FILE = "res/courses.txt";

    private ArrayList<Dogs>     dogsList;
    private ArrayList<Courses>  courseList;

    public DogCompetitionManager()
    {
        loadDogs();
        loadCourses();
        runAdministration();
    }

    private void loadDogs()
    {   // creates a dogsList array
        dogsList = new ArrayList<Dogs>();
        BufferedReader inFile = null;

        try
        {
            inFile = new BufferedReader(new FileReader(DOGS_FILE));
            String line = inFile.readLine();
            while(line != null)
            {
                String[] items;
                items = line.split(" ");

                dogsList.add(new Dogs(items[0],
                            items[1],
                            Double.parseDouble(items[2]),
                            Integer.parseInt(items[3]),
                            items[4]));
                line = inFile.readLine();
            }
            inFile.close();
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }    
}

1 个答案:

答案 0 :(得分:2)

永远不要相信用户输入!

String[] items;
items = line.split(" ");

dogsList.add(new Dogs(items[0],
                        items[1],
                        Double.parseDouble(items[2]),
                        Integer.parseInt(items[3]),
                        items[4]));

在这里,您可以分割输入行,并期望它具有特定格式。这很不稳定。你首先应该确定,实际该格式并相应地处理它,如果它没有。

至少你应该对错误做一些输出。然后你可以忽略该行并处理文件的其余部分,或者你可以抛出异常,中止进程。取决于您的要求。

一个简单的检查是查看String[]在分割后是否包含您期望的项目(或者可能为null)。

示例:

if( null == items || items.length < 5 ) { 
    // 1. LOG ERROR

    // To ignore line and move on:
    line = inFile.readLine();
    continue;
}

更复杂的一种是使用某种RegEx来查看是否有数字,你期望它们等等。我还建议在将字符串转换为数值时捕获Parse-Errors。