P315-P325
《Head First Java》20201015读书笔记
创建MIDI音乐播放器
创建一个声效应用程序,包括BeatBox Drum播放器。
如何创建Swing GUI、如何通过网络连接到其他计算器,以及让我们可以把数据送出的输入/输出设备。
JavaSound API
JavaSound被分为两个部分:MIDI和取样(sampled)。
MIDI,MusicalInstrument Digital Interface,不同电子发声装置沟通的标准协议。
在程序中,可以把MIDI想象成某种乐谱,可以输入到某种“高级多功能电子魔音琴”中,MIDI本身不带有声音,它带有的是MIDI播放功能装置的指令。
MIDI数据表示执行的动作(播放中央C,以及音量大小和长度等),但没有实际的声音。它并不知道怎样产生钢琴、吉他、鼓的声效,实际的声音是靠装置发出的。
首先需要一个Sequencer
在发出任何声音之前,必须先要取得Sequencer对象。
此对象会将所有的MIDI数据送到正确的装置上,由装置来产生音乐。
import javax.sound.midi.*;//引用该包
public class MusicTest1{
public void play(){
Sequencer sequencer = MidiSystem.getSequencer();//这个对象的作用是将MIDI信息组合成“乐曲”
System.out.println("We got a sequencer");
}//关闭播放
public static void main(String[] args){
MusicTest1 mt = new MusicTest1();
mt.play();
}//关闭mian
}//关闭类
Java使用异常表明调用方法的程序代码有问题
Java的异常处理(exception-handing)机制是个捷径,轻量化的执行期间例外状况处理方式,能够将处理错误状况的程序代码摆在一个容易阅读的位置。
这要依赖你已经知道所调用的方法是有风险的(也就是方法可能会产生异常),因此你可以编写出处理此可能性的程序代码。
如果你知道调用某个方法可能会有异常状况,就可以预先准备好对问题的处理程序,甚至是从错误中恢复。看到该方法的声明有throws语句,就可以得知这个方法会抛出异常。
getSequencer()这个方法可能会在执行期间出问题,所以必须声明出调用它可能会有风险。
编译器要确定你了解所调用的方法是有风险的。
把有风险的程序代码包含在try/catch块中,try/catch块会告诉编译器你确定知道所调用的方法会有风险,并且也已经准备好处理它,它只会注意你有没有表示你会注意到异常。
import javax.sound.midi.*;
public class MusicTest1{
public void play(){
try{
Sequencer sequencer = MidiSystem.getSequencer();//把有风险的程序放在try块
System.out.println("Successfully got a sequencer");
}catch(MidiUnavailableException ex){
System.out.println("Bummer");//用catch块摆放异常状况的处理程序
}
}//关闭播放
public static void main(String[] args){
MusicTest1 mt = new MusicTest1();
mt.play();
}//close main
}//关闭类
异常是一种Exception类型的对象
“我会try一下这个高级动作,如果失败的话,我也会catch住我自己。”
方法可以抓住其他方法所抛出的异常。异常总是会丢回给调用方。
会抛出异常的方法必须要声明它有可能会这么做。
编译器会核对每件事,除了RuntimeExceptions之外。编译器保证:
- 如果你有抛出异常,则你一定要使用throw来声明这件事。
- 如果你调用会抛出异常的方法,你必须得确认你知道异常的可能性。将调用包在try/catch块中是一种满足编译器的方法。
要点
- 方法可在运行期间遇到问题时抛出异常。
- 异常是Exception类型的对象。
- 编译器不会注意RuntimeException类型的异常。RuntimeException不需要声明或被包在try/catch的块中(可以这么做)。
- 编译器所关心的是称为检查异常的异常。程序必须要认识有异常可能的存在。
- 方法可以用throw关键词抛出异常对象:throw new FileIsTooSmallException( );
- 可能会抛出异常的方法必须声明成throws Excpetion。
- 如果程序调用了有声明会抛出异常的方法,就得要告诉编译器已经注意到这件事。
- 如果要处理异常状况,就把调用包在try/catch块中,并将异常处理/恢复程序放在catch块中。
- 如果不打算处理异常,还是可以正式地将异常给ducking来通过编译,稍后会解释ducking。