2013-12-22 24 views
0

我正在嘗試使用javax.sound.sampled, 啓動音樂到我的程序中,並且我寫了一個名爲music的方法,該方法在執行時應該啓動音樂片段。它是這樣的:當使用clip.open啓動音樂時,Java負數組大小例外

public void playMusic(){ 
    try { 
     AudioInputStream astream = AudioSystem.getAudioInputStream(
       newFileInputStream("bin/ctk_tune.mp3"));  
     AudioFormat baseFormat = astream.getFormat(); 

     AudioFormat newFormat = new AudioFormat(
      AudioFormat.Encoding.PCM_SIGNED, 
      baseFormat.getSampleRate(), 
      16, 
      baseFormat.getChannels(), 
      baseFormat.getChannels() * 2, 
      baseFormat.getSampleRate(), 
      false); 

     AudioInputStream dstream = AudioSystem.getAudioInputStream(
       newFormat, astream); 

     Clip clip = AudioSystem.getClip(); 
     clip.open(dstream); 

     clip.setFramePosition(0); 
     clip.start(); 
    } catch(IOException ex) { 
     System.out.println("music not loaded : "); 
     ex.printStackTrace(); 
    } catch (UnsupportedAudioFileException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (LineUnavailableException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

當我試圖運行它,我得到了一個未捕獲的異常(該程序沒有啓動)至極說:

Exception in thread "main" java.lang.NegativeArraySizeException 
at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:449) 
at mainProgram.playMusic(mainProgram.java:211) 
at mainProgram.<init>(mainProgram.java:67) 
at Launcher.main(Launcher.java:16) 

回答

0

我認爲,當它調用你的代碼失敗此方法:

@Override 
public void open(AudioInputStream stream) 
     throws LineUnavailableException, IOException { 
    byte[] buffer = new byte[(int) (stream.getFrameLength() * 
            stream.getFormat().getFrameSize())]; 
    stream.read(buffer, 0, buffer.length); 
    open(stream.getFormat(), buffer, 0, buffer.length); 
} 

這樣看來,表達式:

stream.getFrameLength() * stream.getFormat().getFrameSize() 

給你一個負值。這將導致該例外...並且我看不到任何其他方式,例外可能發生在該方法中。

我的猜測是,您創建流或格式描述符的方式有問題,或者您嘗試播放的音頻文件有問題。


我建議你使用調試器來找出爲什麼表達式是負面的。

+0

你說得對。用system.out.print();我發現astream.getFormat()和dstream.getFormat()都是-1。但是,我不知道這是爲什麼(我的音樂源代碼是一個有效的音樂曲目)。如果有人知道如何解決這個問題,我會讚賞它。 – nat

+0

繼續調試。如果您使用DEBUGGER **向後**,可以找出導致這些數字爲負數的原因。 –