簡體   English   中英

程序在 Eclipse 中工作,但是當我導出到可運行的 JAR 時它沒有。 文件未找到異常

[英]Program works in Eclipse but when I export to runnable JAR it doesnt. FileNotFoundException

我試圖制作一個可運行的 JAR,但由於某種原因我無法運行我的游戲。 我做了一些研究並通過我的命令提示符運行它以嘗試找到錯誤,我在下面得到了這個。 所以顯然我知道我只需要修復它的問題。 我的 src 中的 res 文件夾中有音頻文件。 因此,如果它已經在程序中,我無法弄清楚為什么會出現此錯誤。 想法?

Exception in thread "main" java.lang.NullPointerException
        at java.base/java.util.Objects.requireNonNull(Unknown Source)
        at java.desktop/javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
        at builder.AudioPlayer.playMenuSound(AudioPlayer.java:20)
        at builder.Game.<init>(Game.java:56)
        at builder.Game.main(Game.java:61)
package builder;

import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

public class AudioPlayer {

    private static Clip play;

    public static void playMenuSound()
    {
        try {
            //AudioInputStream menuSound = AudioSystem.getAudioInputStream(new File("src/res/introSong.wav")); //Take in audio from res folder
            AudioInputStream menuSound = AudioSystem.getAudioInputStream(AudioPlayer.class.getClassLoader().getResourceAsStream("introSong.wav"));
            play = AudioSystem.getClip(); //
            play.open(menuSound); //Play the sound
            FloatControl volume = (FloatControl) play.getControl(FloatControl.Type.MASTER_GAIN); //Get control of volume
            volume.setValue(1.0f); //0.0 - 1.0 volume
            play.loop(Clip.LOOP_CONTINUOUSLY); //Loop once clip is over
        }catch (LineUnavailableException | IOException | UnsupportedAudioFileException e){
            e.printStackTrace();
        }
    }

    public static void playGameSound()
    {
        try {
            //AudioInputStream gameSound = AudioSystem.getAudioInputStream(new File("src/res/inGame.wav")); //Take in audio from res folder
            AudioInputStream gameSound = AudioSystem.getAudioInputStream(AudioPlayer.class.getClassLoader().getResourceAsStream("inGame.wav"));
            play = AudioSystem.getClip(); //
            play.open(gameSound); //Play the sound
            FloatControl volume = (FloatControl) play.getControl(FloatControl.Type.MASTER_GAIN); //Get control of volume
            volume.setValue(0.5f); //0.0 - 1.0 volume
            play.loop(Clip.LOOP_CONTINUOUSLY); //Loop once clip is over
        }catch (LineUnavailableException | IOException | UnsupportedAudioFileException e){
            e.printStackTrace();
        }
    }

    public static void stopMusic()
    {
        play.close(); //Stop music
    }
}

代碼中的問題是您嘗試使用new引用實例化文件的位置,如下所示:

AudioInputStream gameSound = AudioSystem.getAudioInputStream(new File("src/res/inGame.wav"));

您需要使用 ClassLoader 將文件作為resource獲取,而不是這樣做,因為它位於資源 (res) 文件夾內。

您的代碼應如下所示:

AudioInputStream gameSound = AudioSystem.getAudioInputStream(AudioPlayer.class.getClassLoader().getResourceAsStream("inGame.wav"));

同樣應該在playMenuSound()方法中使用introSong.wav完成。 代碼應該看起來像

AudioInputStream gameSound = AudioSystem.getAudioInputStream(AudioPlayer.class.getClassLoader().getResourceAsStream("introSong.wav"));

我真的希望這能解決你的問題。

我已成功使用以下表格設置 Clips。 也許它對你有用。

    URL url = this.getClass().getResource("audio/" + filename);
    AudioInputStream ais = AudioSystem.getAudioInputStream(url);
    DataLine.Info info = new DataLine.Info(Clip.class, ais.getFormat());
    Clip clip = (Clip) AudioSystem.getLine(info);
    clip.open(ais);

方法getResource返回一個URL 方法getResourceAsStream返回一個InputStream URL用作尋址 jar 中的文件的一種方式。

在這個例子中,代碼所在的文件是文件夾“/audio”的父文件,音頻資源在“/audio”文件夾中。

如果您希望將加載器作為靜態方法調用,則以下形式對我有用。

    URL url = AudioPlayer.class.getResource("audio/" + filename);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM