感谢
非常感谢可以私信问我一些问题,这是一种信赖,一种支持,一种动力。真的非常感谢。
问题
源码
import java.io.File;
import java.util.*;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
public class Test{
/**
* @param args
*/
public static void main(String[] args) {
Test lx = new Test();
lx.run();
Thread sy=new Thread();
sy.start();
}
public void run() {
//File wjl = new File(wjm);
AudioInputStream ypsrl = null;
try {
ypsrl = AudioSystem.getAudioInputStream(new File("image/诗翼梦环 - 日本短信铃声.mp3"));
} catch (Exception e) {
System.out.println("文件为空");
}
AudioFormat format = ypsrl.getFormat();
SourceDataLine aqsj = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
try {
aqsj = (SourceDataLine) AudioSystem.getLine(info);// 格式化包装
aqsj.open(format);
} catch (Exception e) {
}
aqsj.start();
int zjtj = 0;
byte[] hczj = new byte[1024];// 小需要缓冲
try {
while (zjtj != -1) {
zjtj = ypsrl.read(hczj, 0, hczj.length);
if (zjtj >= 0)
aqsj.write(hczj, 0, zjtj);
}
} catch (Exception e) {
} finally {
aqsj.drain();// 将残留部分处理干净
aqsj.close();
}
}
}
问题分析和解决
- 看到问题之后,能想到是关于播放音频方面的。
- 看到源码之后,第一感觉这个没弄过,但不慌。
- 尝试运行,将文件替换(源码中的文件我肯定没有),找了一个自己喜欢的mp3文件,去掉中文(有些中文问题可以避免掉),
new File("image/thatgirl.mp3")
。然后通过javac编译,java运行,结果如下:
- 结果打印了
文件为空
,并且有一个空指针(NullPointerException)的异常。观察源码,这个文件为空
是自己写的打印语句,并没有打印真正的异常信息,于是加上异常打印语句。
try {
ypsrl = AudioSystem.getAudioInputStream(new File("image/thatgirl.mp3"));
} catch (Exception e) {
e.printStackTrace(); // 加上打印异常语句,查看真正的异常信息
System.out.println("文件为空");
}
- 再次运行,查看真正的异常信息。结果如下:
- 看到了真正的异常信息,
javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file
,看这个异常并不是java.io的找不到文件的异常,于是尝试将文件路径改为一个不存在的路径,new File("image/thatgirlxxx.mp3")
,运行查看结果,如下:
- 可以看到,这个异常
java.io.FileNotFoundException
才是找不到文件的异常。 - 既然不是找不到文件,就证明是其他问题,查看源码,看用到的类,都是
javax.sound
类,这就不怕了,是java标准类库中的,不是小众的第三方类库,于是准备查看一下相关文档。如何查看文档请看之前博文【java基础(十)】查阅API文档。 - 找到
AudioSystem.getAudioInputStream(File file)
方法,如下:
- 在文档中可以看到对异常
UnsupportedAudioFileException
的描述,如果不是系统中合法的音频文件数据。(基本接近真相)。于是在想,合法的音频文件是什么?于是百度这个异常:
- 第一个结果就是:https://blog.csdn.net/qq_25827845/article/details/79026786,详细请进博文具体查看。结果就是发现
AudioFileFormate
支持wav文件格式,于是下载了一个wav文件格式音频。 - 替换为wav格式文件
new File("image/river.wav")
,替换后运行程序,一切正常,可以播放音频。
建议
- 注意编码缩进规范,不要有太多多余的空行,一个好看的源码会给人很好的心情。
- 有问题不怕,学会解决问题才是进步。敢于问问题,是一种很好的表现。
- 不要自己写一些自己都不能确定的代码。如,这个源码中的
System.out.println("文件为空");
这个应该会对你造成很大的误解,误解为找不到文件,文件路径问题。 - 使用
try...catch
尽量不要直接最大的异常(catch Exception),如果能够明确抛出的异常,就直接catch可能抛出的异常。如果不明确会抛出什么异常,应该将异常信息打印出来,使用e.printStackTrace();
。 - 使用
try...catch
应该在catch中做异常时候的处理,想源码中并没有做处理,还不如直接将异常throw出去,交给上层做处理。
有问题可以随时问我
如果大家有关于java的任何问题,都可以私信我,希望可以帮到大家,同时也是对我的一种信赖,一种支持,一种动力。