无法从jar读取输入

时间:2010-10-27 02:55:09

标签: java

当我运行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);
        }
    }

1 个答案:

答案 0 :(得分:3)

您似乎没有检查您尝试获取的资源是否返回非空值。具体做法是:

song = MidiSystem.getSequence(
    getClass().getResource(filename));

造成了这个特殊问题。可能存在一个更深层次的问题,即除非filename表示的资源实际上在jar中,在Class-Path上或与jar文件getResource()相同的目录中找不到它。如果您尝试访问常规文件系统中的任何位置(而不是jar文件中),那么您应该使用File

song = MidiSystem.getSequence(new File(filename));