首页 > 代码库 > 异常处理方式

异常处理方式

Java提供的是异常处理的抓抛模型(编译时 / 运行时异常均适用)
  1. “抛”:当我们执行代码时,一旦出现异常,就会在异常的代码处生成一个对应异常类的对象,并将此对象抛出。(自动抛出 / 手动抛出:“throw”+异常类对象)(注意是对象)
    >一旦抛出此异常类的异常,那么程序终止运行
    >此异常类的对象抛给方法的调用者
    >可以自定义异常类:①继承现有异常类;②提供一个序列号;③提供几个重载的构造器

  2. “抓”:抓住上一步抛出的异常类对象的方式,即“异常处理方式”
    Java提供了两种方式用来处理一个异常类的对象:
处理方式一:

  1. try{
  2. //可能出现异常的代码
  3. }catch(Exception1 e1){
  4. //处理方式1
  5. }catch(Exception2 e2){
  6. //处理方式2
  7. }
  8. finally{
  9. //一定要执行的代码(可选
  10. }
注:
1.try内声明的变量在 { } 外不可见(类似与局部变量),出了 try{ }就不能调用;
2.仅当出现异常时 catch 才执行,无异常不执行;
3.finally是可选的,且finally中的代码一定会被执行(即使 try / catch 中仍有未处理异常或有return语句);
4.以上代码中的“Exception1”指的是异常的类型,可以直接用“Exception”来广泛的抓异常(相当于多态性),也可以用具体的异常类型;
5.catch中的语句是对异常对象的处理,可以自定,也可以直接调用抓住的异常的对象的方法;
6.catch语句之间的关系有点像“ if-else ”,即:从上往下执行,若 catch 匹配了 try 抛出的异常类对象,则传入该异常类对象,执行语句,然后跳出到 finally(如果有的话);同样这也意味着 catch 语句需要“范围小的先声明”,即:如果有存在子父类关系的 Exception,那么子类的应该写上面,如果写反,会报错(“会报错”这一点并不像 if-else )。如果关系为“并列”,那么孰上孰下都可以;
7.如果异常处理了,则其后的代码继续执行;
8.try-catch是可以相互嵌套的。

例:
  1. @Test
  2. public void test5(){
  3. Scanner read = new Scanner(System.in);
  4. int a;
  5. try{
  6. a = read.nextInt();
  7. System.out.println(a);
  8. }catch(Exception e){
  9. System.out.println("输入的不是整数");
  10. }
  11. read.close();
  12. }

处理方式二:
如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显式地抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。

在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法语句中产生的异常类型,也可以是它的父类。(注意是)(与throw区别开),但是其子类重写此方法时只能抛出该父类的异常类或其子类(否则使用多态性时可能出现编译通过但是catch“罩不住”的情况)。

抛异常只是把问题把上递交了(异常类对象传给调用者),最终还是要解决的,解决的根本方法还是try - catch,如果抛到了main方法还未根本解决 ,那异常会直接给虚拟机。 

对于编译时异常来说,必须处理,而运行时异常可以不显式的处理。

异常处理方式