0

AgendaFunctions というクラス、Main というクラス、ReadFiles というクラスがあります。Main には、Agenda Functions と ReadFiles の参照変数があります。AgendaFunctions には参照変数の配列があります。配列をインスタンス化するコードはありますが、ReadFiles からインスタンス化する必要があります。メインからインスタンス化すると、正常に動作します。しかし、ReadFiles からメソッドを呼び出すと、機能しません。java.lang.NullPointerException エラーが発生します。メインのコードは次のとおりです。

    public class Main {
        public static void main(String[] args) throws Exception {
            ReadFiles fw = new ReadFiles(); fw.read();
            agendafunctions link = new agendafunctions();

議題機能:

    public class agendafunctions {
        int amount = 20;
        public void setamount(int data) {

        }
        static String input = "true";
        agendaitem item[] = new agendaitem[amount];
        int counter = 0;
        public void instantiate() {
                item[1] = new agendaitem();
                item[2] = new agendaitem();
                item[3] = new agendaitem();
        }
        public void createobject(String name, Boolean complete, String Comments) {
            item[counter].name = name;
            item[counter].complete = complete;
            item[counter].comments = Comments;
            counter++;
        }

読み取りファイル:

    public class ReadFiles {
        public void read() throws IOException {
            agendafunctions af = new agendafunctions(); af.instantiate();
            int readitem = 1;
            BufferedReader data = new BufferedReader(new FileReader("C:/Agenda Dev Docs/data.txt"));
            int filestoread = Integer.parseInt(data.readLine());
            while (readitem <= filestoread) {
                String name;
                String complete;
                String comments = null;
                String line;
                Boolean bc = null;
                BufferedReader read = new BufferedReader(new FileReader("C:/Agenda Dev Docs/"+readitem+".txt"));
                readitem++;
                name = read.readLine();
                complete = read.readLine();
                comments = "";
                while((line = read.readLine()) != null) {
                    comments = comments + line;
                }
                if(complete.equals("Complete")) {
                    bc = true;
                } else if(complete.equals("Incomplete")) {
                    bc = false;
                }
                af.createobject(name, bc, comments);
            }
        }

ReadFiles からインスタンス化するメソッドを呼び出すと、NullPointerException が発生します。Main から呼び出すと、すべてが機能します。しかし、さらなる開発では、ReadFiles からメソッドを呼び出す必要があります。どうすればこれを修正できますか? ありがとう。

4

2 に答える 2

2

あなたはこれを持っています

    int counter = 0;
    public void instantiate() {
            item[1] = new agendaitem();
            item[2] = new agendaitem();
            item[3] = new agendaitem();
    }
    public void createobject(String name, Boolean complete, String Comments) {
        item[counter].name = name;
        item[counter].complete = complete;
        item[counter].comments = Comments;
        counter++;
    }

ここitemで、 は 20 個のインデックス、つまり 20 個の要素を持つ配列ですが、instantiateメソッドはインデックス 1 ~ 3 の要素のみを初期化し、0 と 4 ~ 19 が欠落しています。

あなたのReadFiles#read()方法では、あなたはそうします

  agendafunctions af = new agendafunctions(); af.instantiate();

1 つの agendafunctionsオブジェクトをインスタンス化し、配列内のインデックス、、およびでinstantiate()要素を初期化する呼び出しを呼び出します。123item

次に、ループしてwhileand を呼び出します

  af.createobject(name, bc, comments);

同じオブジェクトで何度も。

最初に失敗する理由は、要素itemをインデックス 0 で初期化していないためです。配列は常に01 ではなく から始まります。

エラーのもう 1 つの原因 (上記の問題を修正すると表示されます) は、ループが 3 回以上ループすると、要素が初期化されていないためwhile、ループが 3 回以上ループするため、再びNullPointerExceptions が大量に発生することです。次に、インデックスcounterでアクセスしようとします。counter

item[counter].name = name; // if counter is 4, you'll get NullPointerException because 
                           // the element there hasn't been initialized as 'new agendaitem();'
于 2013-09-07T15:13:45.767 に答える
0

@SotiriosDelimanolis は、メソッドを削除してメソッドの最初の行として追加NPEできることを修正するために、なぜ取得しているのかを説明しました。また、while ループが を超えないようにする必要があります。これらの心配を避けるには、ArrayListを使用することをお勧めします。instantiate()item[counter] = new agendaitem();createobjectamountagendaitem

于 2013-09-07T15:21:08.950 に答える