1

我一直在制作一个小程序,需要读取可能会发生变化并且需要随时调用的高尔夫球场列表。这是代码:

    public class Courses {
public String[] courselist;
public void loadCourses() throws IOException{
    int count = 0;
    int counter = 0;
    File f = new File("src//courses//courses.txt");
    BufferedReader reader = new BufferedReader(new FileReader(f));
    while(count<1){
        String s = reader.readLine();
        if(s.equalsIgnoreCase("*stop*")){
            reader.close();
            count = 5;

        }else{
            courselist[counter] = s;
            counter++;
        }
        s = "";
    }
}

}

现在这就是 txt 文件中的内容。

    RiverChase 
    Steward Peninsula 
    Lake Park 
    Coyote Ridge 
    *stop* 

现在,当我开始运行程序时,因为我立即调用该方法,它给了我一个抛出异常,这是因为数组。我需要留下来排列,因为我在 JComboBox 中使用它。如果你能帮助或解决问题。很可能我只是做错了,我是菜鸟。只是帮忙。提前致谢。我知道所有文件阅读器和东西都能正常工作,因为它可以正确打印到系统,我只需要帮助将它重复写入数组。

4

4 回答 4

2

你应该在使用它之前初始化你的数组

public static final MAX_SIZE = 100;
public String[] courselist = new String[MAX_SIZE];
于 2012-06-06T02:58:45.450 回答
1

您最好创建一个更易于操作的列表,并在流程结束时将其转换为数组:

    List<String> list = new ArrayList<String>();
    String [] array = list.toArray(new String [] {});

这是使用 List 加载的可能实现:

public static String [] loadCourses() throws IOException {
    File f = new File("src//courses.txt");
    BufferedReader reader = new BufferedReader(new FileReader(f));
    List<String> courses = new ArrayList<String>();
    while (true){
        String s = reader.readLine();
        if (s == null || s.trim().equalsIgnoreCase("*stop*")){
            break;
        } else{
            courses.add(s);
        }
    }
    return courses.toArray(new String [] {});
}

还有为什么要使用stop关键字?当您到达文件末尾时(当 s 为空时),您可以简单地停止该过程。

于 2012-06-06T03:01:50.097 回答
1

更改您的代码以在 期间分配一个新数组loadCourses(),并添加loadCourses()对您的构造函数的调用:

public class Courses {
    public String[] courselist;

    public Courses() throws IOException {  // <-- Added constructor
        loadCourses();                     // <-- Added call to loadCourses
    }

    public void loadCourses() throws IOException {
        int count = 0;
        int counter = 0;
        File f = new File("src//courses//courses.txt");
        BufferedReader reader = new BufferedReader(new FileReader(f));
        List<String> courses = new ArrayList<String>(); // <-- A List can grow 
        while(true){
            String s = reader.readLine();
            if (s.equalsIgnoreCase("*stop*")){
                break;
            }
            courses.add(s);
        }
        courseList = courses.toArray(new String[0]); // <-- assign it here
    }
}

这确保了当您创建一个实例时,它会从初始化数组开始。您不仅不会得到错误,而且数据将始终正确(与其他简单地创建空(即无用)数组的答案不同。

请注意,此代码适用于文件中任意数量的课程名称(不仅仅是 5 个)。

于 2012-06-06T03:03:35.133 回答
1

这里有一些例子,没有使用*stop*

public class ReadFile {

    public static void main(String[] args) {
        BufferedReader reader = null;
        List<String> coursesList = new ArrayList<>();
        String[] courses;

        try {
            File file = new File("courses.txt");
            reader = new BufferedReader(new FileReader(file));
            String readLine;

            do {
                readLine = reader.readLine();
                if(readLine == null)
                    break;

                coursesList.add(readLine);
            } while (true);
        } catch (IOException ex) {
            Logger.getLogger(ReadFile.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                reader.close();
            } catch (IOException ex) {
                Logger.getLogger(ReadFile.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        courses = coursesList.toArray(new String[coursesList.size()]);

        for(int i = 0; i < courses.length; i++) {
            System.out.println(courses[i]);
        }
    }
}
于 2012-06-06T03:12:52.160 回答