我程序中的一个功能是播放Mp3文件。我正在使用JLayer库(http://www.javazoom.net/javalayer/javalayer.html)来实现这一目标。
另外,为了防止在歌曲播放时阻止节目,我想使用Threads。请参阅此代码段:
import javazoom.jl.player.Player;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class P2PClient {
private static Player player;
public static void main (String[] args) {
try {
play(args[0]);
} catch (FileNotFoundException | javazoom.jl.decoder.JavaLayerException e) {
e.printStackTrace();
}
System.out.println("Hello");
player.close();
}
private static void play(String track) throws FileNotFoundException, javazoom.jl.decoder.JavaLayerException {
new Thread() {
private Player player = new Player(new FileInputStream(track));
@Override
public void run() {
try {
P2PClient.player = this.player;
player.play();
} catch (javazoom.jl.decoder.JavaLayerException e) {
e.printStackTrace();
}
}
}.start();
}
}
播放有效。此外,打印“Hello”,因此我知道play(args[0])
没有阻止当前线程。什么不起作用的是player.close()
行......相反,我在这一行得到了一个NullPointerException。
我希望在匿名线程实例中引用player
,并且仍然通过调用void play(String track)
“自动启动”该线程。因此,我采用了一种在private static Player
类中声明P2PClient
变量的丑陋方法。
我不明白为什么我得到这个NullPointerException ...如果这是一种不正确的方法来完成我想要的,如何在不返回player
对象的情况下获得Thread
引用?