Estou com problemas quando tento executar um audio em .jar

O problema é o seguinte quando eu só executo na IDE ele funciona o som normal mas quando eu compilo e tento executar aparece NullPointerException ou seja ele não achou o audio, mas
porque como resolvo isso? bom aqui está o codigo da classe do meu player:

import java.applet.Applet;
import java.applet.AudioClip;
import java.net.URL;

public class Audio {
    URL fileUrl;
    AudioClip Som;

    public void Play(String qlms) {
        this.fileUrl = this.getClass().getResource(qlms);
        this.Som = Applet.newAudioClip(fileUrl);
    }
}

Eu gostaria de saber como resolver isso.

Qual o valor que está vindo no parâmetro qlms?

Ele está vindo de outra classe e o parametro é:
som.Play(“Sons/ThemeSong2.wav”);

Esse arquivo está dentro do jar? Como está a estrutura de pastas do seu projeto?

Acho que você quis dizer isso e não as pastas em si tipo como se eu tivesse aberto um jar com winrar, se for o que eu estou pensando aqui esta uma imagem do meu projeto
AAAAA

1 curtida

Agora estou com 2 problema ele também não acha os arquivos dentro do pacote
mas se eu tirar de la de dentro deve voltar a funcionar mas continua o problema do .jar

Em vez de usar:

"Sons/ThemeSong2.wav"

Tente assim:

"/PacoteJogo/Smarphone/Sons/SongTheme2.wav"

Update

Agora que reparei, vc está tentando carregar o arquivo ThemeSong2.wav, mas o nome dele no print que mandou é SongTheme2.wav. Está certo isso?

Nossa tinha escrito errado eu tinha escrito errado agora eu consertei mas continua o problema
AAAAAAAAAAAAAAAAAAAAA

Tenta colocar da forma que falei agora

Continua com o mesmo problema :frowning:
image

Foi mal, eu digitei errado, faltou o t em Smartphone. O certo é:

"/PacoteJogo/Smartphone/Sons/SongTheme2.wav"

Mesma coisa…

Você está no windows ou no linux? Se for no windows, tente assim:

"\\PacoteJogo\\Smartphone\\Sons\\SongTheme2.wav"

O meu pc é windows, e continua não funcionado

Mano, vc disse que soh dá erro quando executa através do jar, certo? Se sim, volte a utilizar a String “Sons/ThemeSong2.wav”.

Reparei agora, esse erro soh aparece quando vc gera o jar. Nesse caso, vc não pode usar: this.getClass().getResource(qlms);. Pois a JVM não vai conseguir determinar o path dentro do jar.

Para contornar isso, vc deve usar: this.getClass().getResourceAsStream(qlms);, que irá retornar um InputStream. Com esse stream, vc pode criar um arquivo temporário assim:

public static File stream2file (InputStream in) throws IOException {
	final File tempFile = File.createTempFile(PREFIX, SUFFIX);
	tempFile.deleteOnExit();
	
	try (FileOutputStream out = new FileOutputStream(tempFile)) {
		IOUtils.copy(in, out);
	}
	
	return tempFile;
}

obs: Esse exemplo usa uma lib externa (IOUtils da apache).

E, através do arquivo temporário criado (tempFile), vc consegue recuperar a URL desse arquivo e passar para o método newAudioClip.

Desculpe a demora tive que fazer uns negocio o que eu coloco no sufix?
Ele ta dizendo que o PREFIX é muito curto, E se eu deixo como está diz que que não achou nada atribuindo o SUFIX nenhuma variavel.

PREFIX = “SongTheme2”
SUFFIX = “wav”

obrigado

ta dando nullPointerException
image

acho que o problema está aqui:

import static com.sun.xml.internal.fastinfoset.vocab.Vocabulary.PREFIX;
import java.applet.Applet;
import java.applet.AudioClip;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.apache.commons.io.IOUtils;

public class Audio {
    URL fileUrl;
    AudioClip Som;
    InputStream a;
	
    public void Play(String qlms) throws IOException {
        System.out.println(qlms);
        
        //Sinto que o problema esta aqui: 27
        
        this.a = this.getClass().getResourceAsStream(qlms);//Bem aqui
        
        //Aqui em cima ^^^^^^
        
        System.out.println(this.a);
        String b;
        b = stream2file(this.a).getPath();
        System.out.println(stream2file(this.a).getPath());
        URL url2 = new URL(b);
        this.fileUrl = url2;
        this.Som = Applet.newAudioClip(this.fileUrl);
    }
	
    public static File stream2file (InputStream in) throws IOException {
		final File tempFile = File.createTempFile("SongTheme2", ".wav");
		tempFile.deleteOnExit();
		
		try (FileOutputStream out = new FileOutputStream(tempFile)) {
			IOUtils.copy(in, out);
		}
		
		return tempFile;
	}
}

Não se preocupe, vamos conseguir kkk

Agora tente passar um desses paths:

"\\PacoteJogo\\Smartphone\\Sons\\SongTheme2.wav"
"/PacoteJogo/Smartphone/Sons/SongTheme2.wav"