处理异常方式try_catch_finally, throws,throw

如何处理 Exception 的异常: 

     抓抛模型:1.抓:异常的处理,有两种方式①try-catch-finally   ②throws+异常类型

                     2.抛:一旦执行过程中出现异常,会抛出一个异常类的对象(自动的抛出 vs  手动的抛出(throw+异常类对象))

异常处理方式一:try_catch_finally

package com.aff.excep;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.junit.Test;

/*
处理Exception的异常
java提供的异常处理的抓抛模型:
          1. "抛" 执行代码,出现异常,就会在异常的代码处生成一个对应异常的类的对象, 并将此对象抛出
                  一旦抛出此异常的对象, 那么程序就终止运行,此异常的对象抛给方法的调用者
          2. "抓" 抓住上一步抛出来的异常类的对象。
异常处理的方式:
          java提供了两种方式用来处理一个异常类的对象
          处理方式一:try{
                                   //可能出现异常的代码
                              }catch(Exception e1){
                                  //处理的方式1
                              }catch(Exception e2){
                                  // 处理的方式2
                              } finally{
                                  //一定执行的代码
                              }
注:1.try内生命的变量, 类似于局部变量。出了try{ }语句,就不能被调用
       2.finally是可选的。
       3.catch语句内部是对异常对象的处理
                             getMessage();    printStackTrace();
       4.可以有多个actch语句,try中抛出的异常类对象从上往下匹配catch中的异常类的类型,
          一旦满足,就执行catch中的代码,执行完,就跳出其后的多条catch语句              
       5.如果异常处理了,其后面的代码可以执行了    
       6.若catch 中多个异常类型是 "并列" 关系,谁上谁下都可以
         若catch中多个异常类型的 "包含" 关系,须将子类放在父类的上面,进行处理,否则报错
       7.finally 中存放的一定是会被执行的代码,不管try中,catch中是否有异常未被处理,以及是否有return
       8.try- catch是可以嵌套的 
       
对于运行时异常来说,可以不显式的进行处理,
对于编译时异常来说,必须要显式的进行处理

 */
public class TestException1 {
    @Test
    public void test6() {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(new File("heel.txt"));
            int b;
            while ((b = fis.read()) != -1) {
                System.out.println((char) b);
            }
        } catch (FileNotFoundException e1) {// e1相当于局部变量, 下面的exception也可以使用e1
            // System.out.println(e1.getMessage());
            System.out.println("找不到文件");
        } catch (IOException e1) {
            System.out.println(e1.getMessage());
        } finally {
            // 一定会执行的代码
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Test
    public void test2() {
        try {
            int[] i = new int[10];
            // System.out.println(i[10]);
            System.out.println(i[-10]);
        } catch (Exception e) {
            // e.printStackTrace();
            System.out.println("出现异常");
            // System.out.println(e.getMessage());
        } finally {
            // 一定会执行的代码
        }
    }
}

 

异常处理方式一:throws ,向上抛 最后用try-catch 解决

 

package com.aff.excep;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/*
 异常处理方式二:在方法的声明处,显示的抛出该异常对象的类型
 格式:如public  static void   method2() throws IOException{ }
           当在此方法内部出现异常的时候回抛出一个异常类的对象,抛给方法的调用者
           异常的对象可以逐层向上抛,直至main中,当然在向上抛的过程中,可以再通过try-catch-finally进行处理

 */
public class TestException2 {
    public static void main(String[] args) {
        try {
            method2();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public  static void   method2() throws IOException{
        method1();
    }
    
    public  static void method1() throws IOException {
        FileInputStream fis = new FileInputStream(new File("heel.txt"));
        int b;
        while ((b = fis.read()) != -1) { 
            System.out.println((char) b);
        }
    }
}

 

 

手动的抛出异常:

package com.aff.excep;
//1.手动的抛出一个异常
//2.抛出的异常类型若是RuntimeException,可以不显示的处理
//若是一个Exception,必须要显式的处理
public class TestCircle {
    public static void main(String[] args) {
        Circle c1 = new Circle(2.1);
        Circle c2 = new Circle(2.1);
        try {
            System.out.println(c1.comparTo(c2));
            System.out.println(c1.comparTo(new String("AA")));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Circle {
    private double radius;

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    public Circle(double radius) {
        super();
        this.radius = radius;
    }

    // 比较两个圆的半径的大小
    public int comparTo(Object obj) throws Exception {
        if (this == obj) {
            return 0;
        } else if (obj instanceof Circle) {
            Circle c = (Circle) obj;
            if (this.radius > c.radius) {
                return 1;
            } else if (this.radius == c.radius) {
                return 0;
            } else {
                return -1;
            }
        } else {
            // return -2;
            //throw new RuntimeException("传入的类型有误");//运行时异常编译不显示错误
            throw new Exception("传入的类型有误");
        }
    }
}

 

posted @ 2020-03-27 11:25  林淼零  阅读(225)  评论(0)    收藏  举报