2010-10-27 137 views
0

讀取輸入當我運行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相反,它可能沒有問題發揮。代碼有什麼問題?我已經與換行符清單文件添加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

我猜它是與你如何訪問文件,但我們需要看到你的代碼真正幫助你。 – 2010-10-27 02:56:42

+0

好吧,我已經添加了我的代碼。我的輸入是「MidiFileNewsong.mid」,然後將其剝離並播放「song.mid」。 – Proyb2 2010-10-27 03:06:48

回答

3

您似乎沒有被檢查,如果你想獲取資源是返回的東西非空。具體如下:

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

正在造成這個問題。可能會有一個更深層的問題,那就是除非filename代表的資源實際上在罐子裏,在類路徑上或者與jar文件getResource()不會找到它相同的目錄中。如果你想在任何地方訪問文件的文件系統一般(不是在JAR文件),那麼你應該使用File

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

這真的解決了。謝謝!現在我可以開發一個midi軟件了。 – Proyb2 2010-10-27 03:20:18