java笔记异常处理

创建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必须要声明异常;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值