0

以下の 2 番目の if ステートメントで nullpointer エラーが発生するのはなぜですか?

scores配列文字列が空かどうかを if ステートメントでチェックしていますが、nullpointer 例外を言って常にクラッシュします。それが役立つ場合は、LogCat も追加しました。

String[] scores;
String times = "";

public void Read() {
    FileInputStream inputStream = null;

    try {

        inputStream = openFileInput("timesfile");

        byte[] reader = new byte[inputStream.available()];

        while (inputStream.read(reader) != -1) {
        }
        times = new String(reader);

    } catch (IOException e) {
        e.printStackTrace();

    } finally {
        if (inputStream != null) {
            try {
                    inputStream.close();
            } catch (IOException e) {
                    e.printStackTrace();
            }

        }

    }

    if (!times.isEmpty() && times != null && times != ""
                    && times.length() != 0) 
    {
        scores = new String(times).split(",");
        Arrays.sort(scores);
    }
    if (scores.length != 0 && scores != null && scores.length >= 4) { //I get a nullpointer exception here!

        better = false;
        if (Integer.parseInt(endTime.split(":")[0]) > Integer
                        .parseInt(scores[0].split(":")[0])) {
            better = true;
        } else if (Integer.parseInt(endTime.split(":")[1]) > Integer
                        .parseInt(scores[0].split(":")[1])) {
            better = true;
        } else if (Integer.parseInt(endTime.split(":")[2]) > Integer
                        .parseInt(scores[0].split(":")[2])) {
            better = true;
        } else {
            better = false;
        }

    }

}

LogCat:

11-16 22:32:21.195: E/AndroidRuntime(28584): FATAL EXCEPTION: Thread-2278
11-16 22:32:21.195: E/AndroidRuntime(28584): java.lang.NullPointerException
11-16 22:32:21.195: E/AndroidRuntime(28584):    at com.example.app.TestActivity$TestView.scoreRead(TestActivity.java:426)
11-16 22:32:21.195: E/AndroidRuntime(28584):    at com.example.app.TestActivity$TestView.over(TestActivity.java:303)
11-16 22:32:21.195: E/AndroidRuntime(28584):    at com.example.app.TestActivity$TestView.run(TestActivity.java:267)
11-16 22:32:21.195: E/AndroidRuntime(28584):    at java.lang.Thread.run(Thread.java:856)
4

7 に答える 7

3

times != null を一番左にしてみてはいかがでしょうか 。操作の順番は左から右です。

if (回 != null && !times.isEmpty() && 回 != "" && 回.length() != 0)

編集:はい、@Simonは正しいです..そうあるtimes != ""べきです !times.equal("")

とにかく、すでにチェック!times.isEmpty()しているので、その部分はまったく必要ありません。

これは次のことを行う必要があります。

if (回 != null && !times.isEmpty() )

于 2012-11-16T21:46:46.217 に答える
1

if(times!= null)最初に行う

その後、その中にネストされます!times.isEmpty()

isEmpty()は、文字列の長さがゼロかどうかを確認します。nullかどうかではありません。長さ0は""、nullではありません

チェックされているのが別の文字列である場合も、同じ原則が適用されます。

于 2012-11-16T21:41:09.337 に答える
1

交換

if (scores.length != 0 && scores != null && scores.length >= 4) {

if (scores != null && scores.length >= 4) {

交換

if (!times.isEmpty() && times != null && times != "" && times.length() != 0) 

if (times != null && !times.isEmpty()) 

つまり、条件の前に null チェックを置き、不要なガードを削除します。

于 2012-12-01T17:27:53.647 に答える
0

これは安全なチェックではありません。

times != ""

String の等価演算子は、2 つの String が同じオブジェクトであるかどうかをテストします。代わりに、

!times.equal("")

!=Java が文字列を「インターン」し、偶然、それらが同じオブジェクトである可能性があるため、"" が機能する場合もありますが、それに依存するべきではありません。

于 2012-11-16T21:47:37.457 に答える
0

あなたの質問とコメントは一致しませんが、チェックしているかどうかに関係なく、それらが最初scoresであるかどうかを確認timesする必要があります。(そうしないと、NPE が表示されます。)null

使用する:

if (times != null && !times.isEmpty() && times != "" && times.length() != 0)

と:

if (scores != null && scores.length != 0 && scores.length >= 4) {

以下の 2 番目の if ステートメントで nullpointer エラーが発生するのはなぜですか?

である変数に対してメソッドを呼び出そうとすると、NullPointerException が発生しますnullscoresである場合null、このコードscores.lengthは を呼び出そうとしていますnull.doSomething()。何かをするために何も要求することはできません。

于 2012-11-16T21:52:51.133 に答える
0

変数times not が null です。彼女は null 値ではなく空の値で初期化されました。

NullPointerException は、TestActivity クラスの行 426 にあります。その行は次のとおりだと思います。

if (scores.length != 0 && scores != null && scores.length >= 4) {

したがって、コードをよく調べると、上記の条件が間違っているため、スコア変数は null です。

このためのコードを変更します。

if (!times.isEmpty()) 
{
     scores = times.split(",");
     Arrays.sort(scores);
}
if (scores != null && scores.length > 0) {

   ...

}
else {

   System.err.println("There isn't score");
}
于 2012-11-16T22:55:19.877 に答える
0

実際にスコア配列が初期化されるのは、

!times.isEmpty() && 回 != null && 回 != "" && 回.length() != 0

本当です。それは真実ではないように起こりました:)。また、時間にメソッドを呼び出して、それをnullと比較するのは意味がありません。ただし、ここでは NPE はスローされないので、省略します。

!times.isEmpty は times.legth != 0; と同じです。

times != "" は、「new」操作で初期化され、インターンされないとすぐに常に true になります。

したがって、すべての条件は等しいです(ご覧のとおり、時間はnullではありません)

!times.isEmpty

とにかく、チェックされたオブジェクトでのメソッド呼び出しを含む他のチェックの前に null をチェックする必要があります。

于 2012-11-16T22:14:35.547 に答える