try/catch
编译器需要确定你了解所调用的方法是有风险的,只要你把有风险的程序代码包含在try/catch块中,编译器就不会报错。
异常是一种Exception类型的对象,Exception类型的对象可以是任何它的子类的实例。
try {
//危险动作
} catch(Exception ex) {
//尝试恢复
}
异常是由有异常的方法丢出的:
1.方法可以抓住其他方法所抛出的异常,异常总是会丢回给调用方。
2.会抛出异常的方法必须要声明它有可能会这么做。
//会抛出异常的方法
public void takeRisk() throws BadException {
if(abandonAllHope) {
throw new BadException();
}
}
//调用该方法的代码
public void crossFingers() {
try {
anObject.takeRisk();
} catch(BadException ex) {
System.out.println("Aaargh!");
ex.printStackTrace();
}
}
编译器会检查不是RuntimeException的子类的异常,被称为“检查异常”。RuntimeException子类的异常被称为“运行时异常”。
流程控制
1.try块会先运行,如果不抛出异常,则跳过catch块执行后续部分。
2.如果抛出异常,会跳过try块与catch块中间部分代码而运行catch块程序,然后继续下去。
3.finally块是用来存放不管有没有异常都要执行的程序。
多态的异常
1.方法可以抛出多个异常,但其声明中必须含有全部可能的异常。
2.若多个异常有共同的父类时,可以只声明该父类就行。
3.必须有相对应的catch块来处理多个异常。
4.有多个catch块时要从小排到大,即按照继承树子类到父类的顺序排列。
duck
1.不想处理异常时,可以将其throws掉来避开。
2.这只是在踢皮球,早晚需要处理异常。
MIDI
JavaSound的工作原理:
发声的装置(Sequencer)→要演奏的乐曲(Sequence)→带有乐曲的信息记录(Track)→乐曲的音符等信息(Midi Event)
//取得Sequencer并打开
Sequencer player = MiddiSystem.getSequencer();
player.open();
//创建新的Sequence
Sequence seq = new Sequence(timing,4);
//从Sequence中创建新的Track
Track t = seq.createTrack();;
//填入MidiEvent并让Sequencer播放
t.add(myMidiEvent1);
player.setSequence(seq);
制作MidiEvent:
//创建Message
ShortMessage a = new ShortMessage();
//置入指令
a.setMessage(144,1,44,100);
//创建MidiEvent
MidiEvent noteOn = new MidiEvent(a,1)
//将MidiEvent加入到Track中
track.add(noteOn);