当我运行java -jar MidiTest.jar
时,输入一个MIDI文件,它会抛出:
Exception in thread "main" java.lang.NullPointerException at com.sun.media.sound.StandardMidiFileReader.getSequence(StandardMidi leReader.java:209) at javax.sound.midi.MidiSystem.getSequence(MidiSystem.java:802) at MidiTest.playMidi(MidiTest.java:56) at MidiTest.(MidiTest.java:44) at MidiTest.main(MidiTest.java:25)
如果我使用java MidiTest
,那么它可以毫无问题地播放。代码有什么问题?我已经在Manifest文件
Main-Class: MidiTest
换行符
我的代码:
private void playMidi() {
if(isPlaying.equals("0")) {
try {
song = MidiSystem.getSequence(
getClass().getResource(filename));
sequencer = MidiSystem.getSequencer();
sequencer.setSequence(song);
sequencer.open();
sequencer.addMetaEventListener(this);
sequencer.start();
} catch (InvalidMidiDataException e) {
System.out.println("Bad midi file: "
+ filename);
System.exit(1);
} catch (MidiUnavailableException e) {
System.out.println("No sequencer available");
System.exit(1);
} catch (IOException e) {
System.out.println("Could not read: "
+ filename);
System.exit(1);
}
displayMidiInfo(filename);
} else {
updateTempoFactor(speed);
}
}
答案 0 :(得分:3)
您似乎没有检查您尝试获取的资源是否返回非空值。具体做法是:
song = MidiSystem.getSequence(
getClass().getResource(filename));
造成了这个特殊问题。可能存在一个更深层次的问题,即除非filename
表示的资源实际上在jar中,在Class-Path上或与jar文件getResource()
相同的目录中找不到它。如果您尝试访问常规文件系统中的任何位置(而不是jar文件中),那么您应该使用File
:
song = MidiSystem.getSequence(new File(filename));