-1

私はこのコードに大きな問題があり、それを引き起こす方法がわかりません:

while(tree.find(indexreg)!=null){
        //do stuff
    }

何らかの理由で、tree.find(indexreg)をnullと比較すると、NullPointerExceptionが発生します。これは大学のプロジェクトなので、Javaで提供されているものではなく、独自のバイナリツリー実装を使用する必要があります。treeはBinarySearchTreeであり、indexregはComparableオブジェクトであり、すでに初期化されています。これは、BinarySearchTreeクラスで検索するためのコードです。

public Comparable find(Comparable x) {
        return elementAt(find(x, root));
    }

ツリー内のオブジェクトを検索し、見つからない場合はnullを返します(空のComparableオブジェクトを返すことはできないと思います)。グーグルを試してみましたが、役に立つ答えが見つかりませんでした。このコードを機能させる方法を知っている人はいますか?

4

3 に答える 3

2
public Comparable find(Comparable x) {
    return x == null ? null : elementAt(find(x, root));
}

fyiこれは次と同等です:

public Comparable find(Comparable x) {
    if (x == null) return null;
    return elementAt(find(x, root));
}

コードの明確さを改善することも検討する必要はありません。メソッド呼び出しとテストを組み合わせたものがあります。これ自体は「悪い」わけではありませんが、私見では、2つを分離し、次のように何かを実行したい場合に返される値を保持する方がクリーンです

for (Comparable<?> result = tree.find(indexreg); result != null; result = tree.find(indexreg)) {
    //do stuff with variable "result"
}

何がループを制御しているのかがより明確になります。

結果を得る別の方法がありますが、それは「悪いコーディングスタイル」と見なされる人もいます。つまり、1つで割り当ててテストすることです。

Comparable<?> result;
while ((result = tree.find(indexreg)) != null) {
    //do stuff with variable "result"
}

このスタイルのコーディングは避けるべきだと考える人もいます。私は彼らに同意する傾向があります。

于 2011-06-05T02:28:59.043 に答える
2

問題はあなたとは何の関係もないと思いますComparable

行が。while(tree.find(indexreg) != null) {をスローする場合NullPointerException、それはである必要がありtreeますnull。他の可能性は信頼できません。

  • オブジェクト参照とNPEのnull使用==またはスローなしとの比較。!=したがって、がtree.find(...)返されたとしてもnull、それがこの例外の原因になることはありません。

  • メソッド引数として値を渡してもnull、NPEはスローされません。したがって、もしそうなら、それindexregnullこの例外を引き起こさないでしょう。(NPEは、メソッドまたはそれが呼び出すものによってスローされる可能性findがありますが、スタックトレースは、例外の発生源として別のメソッドの別の行を表示しません。)


(私は質問を誤解している可能性があります。行が例外を「引き起こす」と彼が言うとき、OPは「投げる」を意味すると思います。

残念ながら、OPはコードのスニペットを投稿しているだけで、スタックトレースを表示していません...これは重要な証拠です。)

于 2011-06-05T04:43:41.227 に答える
0

おそらくindexregはnullであり、まったく初期化されていません。@Bohemianによって提案されているように、find()をより防御的にコーディングする必要がありますが、これが根本的な問題である可能性があります。または、以下の次のコメントを参照してください。

于 2011-06-05T02:35:29.073 に答える