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

中に新しい配列を割り当てるようにコードを変更し、コンストラクタへ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 に答える
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 [] {});
}

また、なぜ停止キーワードを使用するのですか? ファイルの最後に到達したとき (s が null のとき) にプロセスを停止することができます。

于 2012-06-06T03:01:50.097 に答える