感謝
非常感謝可以私信問我一些問題,這是一種信賴,一種支持,一種動力。真的非常感謝。
問題
源碼
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的任何問題,都可以私信我,希望可以幫到大家,同時也是對我的一種信賴,一種支持,一種動力。
捐贈
若你感覺讀到這篇文章對你有啓發,能引起你的思考。請不要吝嗇你的錢包,你的任何打賞或者捐贈都是對我莫大的鼓勵。