1

編集:

提案したすべての変更を行った後、問題は残りました。デバッガーは、補題変数がnullであると言いましたが、私が適用した修正は状況を改善しませんでした。それで、締め切りの問題のために、私は別の観点から問題に取り組むことにしました。よろしくお願いします。:)

私は小さなプログラムを書いていて、NullPointerException私を夢中にさせています。私には2つのクラスがあります:SystemDirSearch。1つ目は、初期ディレクトリと検索補題のカプセル化です。Searchクラスを以下に示します。簡単に言うと、1つのスレッドで第1レベルのディレクトリを検索し、もう1つのスレッドでサブディレクトリを拡張する必要があります。それは私が例外を得るところです。例外文字列は

Exception in thread "Thread-0" java.lang.NullPointerException
at Search.searchFiles(Search.java:59)
at Search.<init>(Search.java:53)
at SystemDir.<init>(SystemDir.java:61)
at Search$1.run(Search.java:45)
at java.lang.Thread.run(Thread.java:679)

3つのポイントが最後のループ内のt.start()である場合、searchFilesメソッド呼び出し、上記のいくつかの行、およびrunメソッド内の新しいSystemDir呼び出し。手伝ってくれませんか。

public class Search {
   private Thread t;

   public Search(String[] subFiles, final String[] subDir, final String lemma) {
       t = new Thread(new Runnable() {
           @Override
           public void run() {
               for(int i=0;i<subDir.length;i++) {
                   try {
                       System.out.println(subDir[i]);
                       new SystemDir(subDir[i], lemma);
                   }
                   catch (NoDirectoryException ex) {
                       Logger.getLogger(Search.class.getName()).log(Level.SEVERE, null, ex);
                   }
               }
           }
       });

       searchFiles(subFiles,lemma); 
    }

    private void searchFiles(String[] subFiles, String lemma) {
       for(int i=0;i<subFiles.length;i++) {
            t.start();
            if(subFiles[i].contains(lemma)) {
                System.out.println(subFiles[i]);                    
            }
        }
    }
}
4

5 に答える 5

3

原則として、コンストラクターからスレッドを開始しないでください。発生する例外の原因となる可能性がある、あらゆる種類の問題を引き起こす可能性があります。

コンストラクターで行うようにスレッドを作成し、searchFiles公開して、コンストラクターからではなく、クライアント コードからそのメソッドを呼び出します。

それとは別に、次のことを確認しましたか。

  • subFilesnull ではない
  • のいずれもsubFiles[i]ヌルではありません
  • lemmanull ではない

(必要に応じて println ステートメントを追加します)

@Grayで指摘されているように、スレッドを複数回開始することはできません。

于 2012-09-18T17:55:45.860 に答える
2

のソース コードの投稿に失敗しましたSystemDirが、スタック トレースによると、そのコンストラクターは、最初にスレッドを作成したオブジェクトに加えて、新しいオブジェクトを作成しようとしています。 Search

より具体的には、おそらくnew Search(...)SystemDir のコンストラクターのどこかにある式がnullforを渡していsubFilesます。File.list()おそらく、null リターンをチェックしていない場所への呼び出しはありますか? list()パーミッションの欠落からディレクトリが見つからないなどの理由で、ディレクトリをまったくリストできない場合は nullを返すことに注意してください。


また、同じスレッド オブジェクトを複数回開始しようとしているようです。IllegalThreadStateExceptionに複数の要素がある場合は、これが発生しsubFilesます。

于 2012-09-18T18:02:41.800 に答える
0

すべてのコードが含まれていません。

提供された情報を使用して:

、、またはのsearchFilesいずれかが null です。tsubFilessubFiles[i]

于 2012-09-18T17:41:58.510 に答える
0

あなたのコード自体はあまり意味がありません。

そのため、エラーを見つけるのが難しくなります。

Eclipse デバッガーの使用をお勧めします。どの値がであるかを確認してくださいnull

私が知る限り、あなたの問題は、コードを提供していないへの再帰内にあります。SystemDir

于 2012-09-18T17:55:50.773 に答える
0

あなたのsearchFiles方法では、スレッドをループで開始するポイントは何ですか? ループの実行ごとにスレッドを実行しますか? ここで何かが欠けていると思います。

コンストラクターに渡す値が null かどうかを確認します。

于 2012-09-18T17:59:23.850 に答える