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

每当我调用这两种方法中的任何一种时,我的应用程序都会崩溃。这是我称呼它们的地方:

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

ChangeSound() 是按钮的 onClick 方法。如果我删除 ChangeSound() 中的两行,代码会正常工作,但如果这两行中的任何一行都在其中,则应用程序会在单击按钮时崩溃。任何想法为什么?提前致谢!!

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

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

  • 通过将音符的字符串表示与枚举常量直接相关联
  • 通过使用模数而不是 if/else ingetNext

它可能看起来像:

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());
于 2013-08-04T19:01:33.670 回答
0

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

您还应该使 toString(Note) 成为静态方法,并定义非静态 toString() 覆盖。这将使 Note.toString(Note) 能够正确处理空值:

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

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

于 2013-08-04T18:53:44.173 回答