2010-10-27 130 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