2

私の列挙宣言:

public enum Note { A, A_SHARP, B, C, C_SHARP, D, D_SHARP,
    E, F, F_SHARP, G, G_SHARP;

    public String toString(Note note) {
        if (note == Note.A)
            return "A";
        else if (note == Note.A_SHARP)
            return "A#";
        else if (note == Note.B)
            return "B";
        else if (note == Note.C)
            return "C";
        else if (note == Note.C_SHARP)
            return "C#";
        else if (note == Note.D)
            return "D";
        else if (note == Note.D_SHARP)
            return "D#";
        else if (note == Note.E)
            return "E";
        else if (note == Note.F)
            return "F";
        else if (note == Note.F_SHARP)
            return "F#";
        else if (note == Note.G)
            return "G";
        else if (note == Note.G_SHARP)
            return "G#";
        else
            return "";
    }

    public Note getNext() {
        int index = ordinal();
        index++;
        if (index > values().length)
            return values()[0];
        else
            return values()[index];
    }
}

これら 2 つのメソッドのいずれかを呼び出すたびに、アプリがクラッシュします。ここで私はそれらを呼び出します:

public void ChangeSound(View v) {
    note = note.getNext();
    tvSounds.setText(note.toString(note));
}

ChangeSound() は、ボタンの onClick メソッドです。ChangeSound() の両方の行を削除すると、コードは正常に機能しますが、2 行のいずれかがそこにあると、ボタンのクリック時にアプリがクラッシュします。理由はありますか?前もって感謝します!!

EDIT** note は型 Note の変数です

みんなありがとう!null を返していました (Jason C の回答 (私のコメント) を見てください)。これはすべて私にとって役に立ちました!

4

4 に答える 4

4

>=おそらくいくつかの OutOfBoundsException を取得しているので、使用する必要があります

if (index >= values().length)
        return values()[0];
    else
        return values()[index];
}

また、switch の代わりに次のようにすることもできます。

public enum Note { A("A"), A_SHARP("A#"), B("B");

private String s;
public Note (String s) {
    this.s = s;
}
public String toString() {
    return s;
}
于 2013-08-04T18:53:11.203 に答える
2

これを変える:

if (index > values().length)

これに:

if (index >= values().length)
于 2013-08-04T18:55:12.100 に答える
0

「クラッシュ」の意味が不明であり、十分なコンテキストも示していません(「メモ」とは何ですか?)が、これら2行のクラッシュのいずれかを述べたという事実に基づく最も可能性の高い原因は、「メモ' 無効です。「note」が null の場合、ChangeSound は NullPointerException をスローします。ChangeSound が 'note' が null ではないと想定している場合は、実際にそうであることを確認する必要があります。

また、toString(Note) を静的メソッドにし、非静的な toString() オーバーライドを定義する必要があります。これにより、 Note.toString(Note) が null を正しく処理できるようになります。

public static String toString (Note n) {
    return n == null ? "" : n.toString();
}

編集: 他の回答で述べたように、> の代わりに >= を使用する必要があります (== でも十分です)。これも潜在的な問題です。

于 2013-08-04T18:53:44.173 に答える