Java - 声音在Eclipse中播放但不在.jar中播放

时间:2014-03-09 18:38:27

标签: java eclipse audio jar

我一直在学习如何在应用程序中使用声音,一切都运行良好。但当我将项目导出到可执行文件.jar时,一切都变得糟透了......

基本上,当应用程序加载时,窗口会打开,但它是空白的,没有任何加载。当我从应用程序中删除声音时,它在导出等时有效。

我在网上得到了以下代码,并根据我的需要对其进行了修改。它似乎很好,很容易,但由于某种原因,它将无法正常工作。正如我所说的那样,在我运行它的时候(Eclipse),ecerything工作得很好......

我已经使用WinRAR和'jar tf'来检查文件是否与.jar捆绑在一起。它是。

当我从命令行运行时,我得到一个NullPointerException

java.lang.NullPointerException
        at mr.myapp.Sound.loop(Sound.jav
        at mr.myapp.GameComponent.run(Ga
        at java.lang.Thread.run(Unknown Source)

这是代码

package mr.myapp.Sound;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip; 



public class Sound {

    public static Sound main_menu = loadSound("/test.wav");
    public static Sound game = loadSound("/song12.wav");
    public static Sound shoot = loadSound("/shoot.wav");
    public static Sound hit = loadSound("/hit.wav");
    public static Sound fail = loadSound("/fail.WAV");

    private Clip clip;

    public static Sound loadSound(String fileName) {
        Sound sound = new Sound();
        try {
            //AudioInputStream ais = AudioSystem.getAudioInputStream(Sound.class.getResource(fileName));
            AudioInputStream ais = AudioSystem.getAudioInputStream(Sound.class.getResourceAsStream(fileName));
            Clip clip = AudioSystem.getClip();
            clip.open(ais);
            sound.clip = clip;
        } catch (Exception e) {
            System.out.println(e);
        }
        return sound;
    }

    public void play(){
        if(clip == null) return;
        stop();
        clip.setFramePosition(0);
        clip.start();
    }

    public void stop(){
        if(clip.isRunning()) clip.stop();
    }

    public void close(){
        stop();
        clip.close();
    }

    public void loop(){
        clip.loop(Clip.LOOP_CONTINUOUSLY);
     }

    public boolean isActive(){
        return clip.isActive();
     }
}

2 个答案:

答案 0 :(得分:1)

我猜它会尝试从加载.jar文件的本地临时目录中加载文件,而不是从存档本身加载。

您要做的是从存档中加载资源,您可以使用java.lang.Class.getResourceAsStream(String)功能执行此操作。 Here是另一个讨论这种事情的问题。

答案 1 :(得分:0)

我明白了。我的声音文件是.WAV而不是.wav,因为我放入了声音课程。

此外,我必须使用getResource而不是getResourceAsStream