【发布时间】:2011-04-18 13:42:57
【问题描述】:
我不久前创建了一个keyboard application,它从一个 jar 中获取一个 midi 音库作为资源,并使用它来获取音库中包含的乐器名称。这似乎在使用带有 suns java 6 的 windows 7 的机器上以及在使用 suns java 6 的 linux 上运行良好。但是,这似乎不适用于使用 windows xp 使用相同版本的 java 的机器。似乎正在发生的事情是在调用 getInstrumentName() 方法时尚未加载仪器数组。仪器数组被填充到 DefaultControl 类的构造函数中(第二个代码示例)。有人可以帮我理解为什么会这样,为什么它似乎依赖于机器?
我得到这样的当前仪器名称:
data.setControls(new DefaultControls());
data.setKeyboard(new KeyboardPanel(data.getPressed()));
data.getKeyboard().setInstrumentName(data.getControls().getInstrumentName());
我像这样获取并加载音库:
this.synth=MidiSystem.getSynthesizer();
synth.open();
synth.loadAllInstruments(
MidiSystem.getSoundbank(
getClass().getResourceAsStream("soundbank.gm")));
this.instrument=synth.getAvailableInstruments();
this.channels=synth.getChannels();
这是调用加载的方法名称是这样的:
public String getInstrumentName(){
return instrument[selected_instrument].getName();
}
【问题讨论】:
-
有什么例外吗?可能的JDK错误? bugs.sun.com/bugdatabase/view_bug.do?bug_id=4444193
-
它是一个数组索引越界异常被抛出。这很奇怪,因为只有在没有引发错误并且声音库加载成功时才会调用 get name。
-
这可能与您提到的错误有关,我将对此进行调查。
-
我使用 JDK 1.6.0_24 在 XP 上使用 jar 外的音库对其进行了测试。我想知道有什么不同?