Android / Java:枚举方法崩溃应用程序

时间:2013-08-04 18:48:57

标签: java android

我的枚举声明:

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];
    }
}

每当我调用这两种方法中的任何一种时,我的应用程序都会崩溃。我在这里称之为:

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

ChangeSound()是按钮的onClick方法。如果我删除ChangeSound()中的两行,代码将按原样运行,但如果两行中的任何一行都存在,则应用程序会在按钮单击时崩溃。有什么想法吗?在此先感谢!!

编辑** note是Note

类型的变量

谢谢大家!它返回null(看看Jason C的答案(我的评论))。所有这一切对我都有帮助!

4 个答案:

答案 0 :(得分:4)

你应该使用>=,因为你可能会得到一些OutOfBoundsException

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

也可以这样而不是开关:

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;
}

答案 1 :(得分:2)

改变这个:

if (index > values().length)

到此:

if (index >= values().length)

答案 2 :(得分:0)

目前还不清楚“崩溃”是什么意思,你也没有显示足够的背景('注意'是什么?)但最可能的原因是基于你说这两行中的任何一条都崩溃的事实似乎是'note'为空。如果'note'为null,则ChangeSound将抛出NullPointerException。你需要确保如果ChangeSound假设'note'不为null,那实际上就是这种情况。

此外,你应该使toString(注意)一个静态方法,并定义一个非静态的toString()重写。这将使Note.toString(注意)能够正确处理空值:

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

编辑:如其他答案中所述,您应该使用> =而不是> (即使==也足够了),这也是一个潜在的问题。

答案 3 :(得分:0)

其他答案已经发现了这个问题。但请注意,您可以通过两种方式简化代码:

  • 通过直接将注释的String表示与枚举常量相关联
  • 使用模数而不是getNext
  • 中的if / else

它可能看起来像:

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

    private final String noteName;
    Note(String noteName) {
        this.noteName = noteName;
    }

    @Override
    public String toString() {
        return noteName;
    }

    public Note getNext() {
        int nextIndex = (ordinal() + 1) % values().length;
        return values()[nextIndex];
    }
}

在您的主要代码中:

note = note.getNext();
tvSounds.setText(note.toString());