Java 为什么相同的编码在播放相同的.wav文件时得到不同的结果?
java工作正常。我将Test21.java复制到Test22.java,只需将所有“Test21”更改为“Test22”,然后执行它,得到了“java.lang.NullPointerException”。 Test21如下所示:Java 为什么相同的编码在播放相同的.wav文件时得到不同的结果?,java,multithreading,wav,audio-player,Java,Multithreading,Wav,Audio Player,java工作正常。我将Test21.java复制到Test22.java,只需将所有“Test21”更改为“Test22”,然后执行它,得到了“java.lang.NullPointerException”。 Test21如下所示: import java.io.IOException; import javax.sound.sampled.*; public class Test21 extends Thread { private String name; class A
import java.io.IOException;
import javax.sound.sampled.*;
public class Test21 extends Thread {
private String name;
class AudioTest {
public void AudioPlay() {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try{
Clip clip = AudioSystem.getClip();
AudioInputStream inputStream = AudioSystem.getAudioInputStream(classLoader.getResourceAsStream("audio1.wav"));
clip.open(inputStream);
clip.start();
while (!clip.isRunning())
Thread.sleep(10);
while (clip.isRunning())
Thread.sleep(10);
clip.close();
} catch (Exception e)
{
e.printStackTrace();
System.out.println(e);
}
System.out.println("done");
}
}
AudioTest au1 = new AudioTest();
public Test21(String name) {
this.name = name;
}
public void run() {
try {
if (au1!=null) {au1.AudioPlay();}
System.out.println(name);
}finally{}
}
public static void main(String[] args) {
Thread t1 = new Test21("First Thread");
Thread t2 = new Test21("Second Thread");
t1.start();
t2.start();
}
}
import java.io.IOException;
import javax.sound.sampled.*;
public class Test22 extends Thread {
private String name;
class AudioTest {
public void AudioPlay() {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try{
Clip clip = AudioSystem.getClip();
AudioInputStream inputStream = AudioSystem.getAudioInputStream(classLoader.getResourceAsStream("audio1.wav"));
clip.open(inputStream);
clip.start();
while (!clip.isRunning())
Thread.sleep(10);
while (clip.isRunning())
Thread.sleep(10);
clip.close();
} catch (Exception e)
{
e.printStackTrace();
System.out.println(e);
}
System.out.println("done");
}
}
AudioTest au1 = new AudioTest();
public Test22(String name) {
this.name = name;
}
public void run() {
try {
if (au1!=null) {au1.AudioPlay();}
System.out.println(name);
}finally{}
}
public static void main(String[] args) {
Thread t1 = new Test22("First Thread");
Thread t2 = new Test22("Second Thread");
t1.start();
t2.start();
}
}
Test22.java如下所示:
import java.io.IOException;
import javax.sound.sampled.*;
public class Test21 extends Thread {
private String name;
class AudioTest {
public void AudioPlay() {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try{
Clip clip = AudioSystem.getClip();
AudioInputStream inputStream = AudioSystem.getAudioInputStream(classLoader.getResourceAsStream("audio1.wav"));
clip.open(inputStream);
clip.start();
while (!clip.isRunning())
Thread.sleep(10);
while (clip.isRunning())
Thread.sleep(10);
clip.close();
} catch (Exception e)
{
e.printStackTrace();
System.out.println(e);
}
System.out.println("done");
}
}
AudioTest au1 = new AudioTest();
public Test21(String name) {
this.name = name;
}
public void run() {
try {
if (au1!=null) {au1.AudioPlay();}
System.out.println(name);
}finally{}
}
public static void main(String[] args) {
Thread t1 = new Test21("First Thread");
Thread t2 = new Test21("Second Thread");
t1.start();
t2.start();
}
}
import java.io.IOException;
import javax.sound.sampled.*;
public class Test22 extends Thread {
private String name;
class AudioTest {
public void AudioPlay() {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try{
Clip clip = AudioSystem.getClip();
AudioInputStream inputStream = AudioSystem.getAudioInputStream(classLoader.getResourceAsStream("audio1.wav"));
clip.open(inputStream);
clip.start();
while (!clip.isRunning())
Thread.sleep(10);
while (clip.isRunning())
Thread.sleep(10);
clip.close();
} catch (Exception e)
{
e.printStackTrace();
System.out.println(e);
}
System.out.println("done");
}
}
AudioTest au1 = new AudioTest();
public Test22(String name) {
this.name = name;
}
public void run() {
try {
if (au1!=null) {au1.AudioPlay();}
System.out.println(name);
}finally{}
}
public static void main(String[] args) {
Thread t1 = new Test22("First Thread");
Thread t2 = new Test22("Second Thread");
t1.start();
t2.start();
}
}
最初Test21.java也得到了“java.lang.NullPointerException”,但在我做了一些毫无意义的修改后,它成功了。我不明白为什么。“一些没有意义的修改”然后它开始工作了?“没有意义”的奇怪定义!两个文件是否从同一位置启动?怎么用?NPE被扔到哪里?堆栈跟踪?我做了一些类似于将“私有字符串名”更改为“字符串名”的操作,然后又将其更改回来。NPE出现在:Test22$AudioTest.AudioPlay(Test22.java:15)和Test22.run(Test22.java:39)似乎
getResourceAsStream(“audio1.wav”)
没有找到文件-尝试打印getResource(“audio1.wav”)
返回的值以查看文件的预期位置,我只需打开Test22.java并执行它。现在可以播放audio.wav了。getResourceAsStream(“audio1.wav”)或getResource(“audio1.wav”)都可以工作。我还是不知道为什么?可能是休息了很长时间后,它恢复了-:)