创建MIDI音乐播放器
首先我们需要一个Sequencer(放在javax.sound.midi包中)
在任何我们要发出声音之前,必须要先取得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 man(String[] args){
MusicTest1 mt=new MusicTest1();
mt.play(); }
}
//无法通过编译,编译器表示有异常状况必须要处理;
getSequener()这个方法可能会在执行期间出问题,所以必须声明它可能会有风险;(方法的声明有throws语句就行)
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){//用catch块摆放异常状况的处理程序;
System.out.println("Bummer");
}
public static void man(String[] args){
MusicTest1 mt=new MusicTest1();
mt.play(); }
}
异常是一种Exception类型的对象;
try{
危险动作
}catch(Exception ex){//跟方法参数声明一样
尝试恢复//只会在有抛出异常时执行
}
编译器会核对每件事,除了RuntimeException之外;
RuntimeException被称为不检查异常,你可以自己抛出与并抓住它们,但是没有这个必要;任何继承过RuntimeException的类都不会受编译器关于是否声明它会抛出RuntimeException的检查,也不会管调用方是否认识到可能会在运行期间遇到异常;
如果你有抛出异常,则你一定要使用throw来声明这件事;
如果你调用会有抛出异常,你必须得确定你知道异常的可能性,将调用包在try、catch块中是一种满足编译器的方法;
try{
Foo f=x.doriskyThing();
int b=f.getNum();
}catch(Exception ex){
Sustem.out.println("failed");
}
System.out.println("We made it!");
成功:
try先运行,然后跳过catch块运行下面部分;
失败:
调用doRiskyThing()抛出异常,所以全跳过其余的程序运行到catch块执行,然后继续下去;
finally:无论如何都要执行的部分
try{
turnOvenOn();
x.bake();
}catch(BakingException ex){
ex.printStackTrace();
}finally{
turnOvenOff();
}
如果无finally,得同时把turnOvenOff()摆放在try和catch两处;
如果try或catch块有return指令,finally还是会执行,流程会跳到finally然后在回到return指令;
处理多重异常
异常也是多态的;
异常的声明
public class Laundry{
public void doLaundry()throws PantsException,LingerieException{
//可能两个异常的程序代码;
}
}
**以异常的父类来声明会抛出的异常**
public void doLaundry()throws ClothingException{
//声明成ClothingException可让你抛出任何ClotingException的子类;,这代表此方法可以抛出PantsException,LingerieException等异常而不同个别的声明;
}
以所抛出的异常父类来catch异常
try{
laundry.doLaundry();
}catch(ClothingException cex){//可以catch任何ClothingException的子类;
}
try{laundry.doLaundry();
}catch(ShirtException sex){//只能catch两种子类;
}
可以把异常处理代码写成只有一个catch块已父型的Exception来捕获,因此就可以抓到任何可能被抛出的异常,但是无法知道是哪里抛出的异常,因此需要为每个需要单独处理的异常编写不同的catch块;(如果是同样的处理方法可以在一个catch中)
多个catch块要从小排到大;
使用catch块时,java虚拟机只会从头开始往下找到第一个符合范围的异常处理快;
如果不想处理异常时,你可以把它duck掉来避开;
异常处理规则:
catch与finally不能没有try;
try与catch之间不能有程序;
try一定要有catch或finally;
只带有finally的try必须要声明异常;