ACAC 异常处理(2)


/*
*
* 关于try..catch中的finally字句:
*   1、在finally字句中的代码是最后执行的,并且是一定会执行的,几时try语句块中的代码出了异常
*       finally必须和try一共出现,不能单独出现
*   2、finally语句通常使用在哪些情况下?
*       通常在finally语句块中完成资源的释放/关闭
*       因为finally中的代码比较有保障
*       即使try语句块中的代码出现异常,finally中代码也会正常执行
*
* */

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

public class Test07 {
    
    

    public static void main(String[] args) throws IOException {
    
    

            FileInputStream fis = null;

        try{
    
    

            //创建输入流对象
            fis = new FileInputStream("I:\\project\\java进阶\\5.包\\Test\\src\\com\\bj\\javase\\test\\Test01.java");
            //开始读文件

            String s = null;
            s.toString();
            //这里一定会出现空指针异常

            //流使用完需要关闭,因为流是占用资源
            //即使以上程序出现异常,流也要关闭
            //放在这里流就可能执行不了

            System.out.println("helli world");

            //这个close也是抛出异常的,是继承IOException的


        }catch (FileNotFoundException e){
    
    
            e.printStackTrace();
        }catch (NullPointerException e){
    
    
            e.printStackTrace();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }finally {
    
    
            System.out.println("finally方法执行");
            if (fis != null) {
    
    
                fis.close();
            }
            //避免空指针异常,如果直接写fis.close(),可能会出现异常

            /* 流的关闭放在这里比较保险
            * finally中的代码一定会执行的
            * 即使try中出现了异常
            * */

        }

    }
}

/*
*
* finally语句
*   放在finally中的语句,一定会执行的
* */
public class Test08 {
    
    
    public static void main(String[] args) {
    
    

        /*
        * try finally 没有catch可以吗?
        * 可以
        * 先执行try,再finally,return最后
        *
        * */
        try{
    
    
            System.out.println("try........");

            System.exit(0);//退出JVM
            //退出JVM,finally中的语句就不再执行了
            //这个跟Test09里的不一样,没有return,直接把JVM干死了

        }finally {
    
    
            System.out.println("finally.....");
        }


        //这里无法到达,Unreachable statement
       // System.out.println("hello world");

    }
}

/*
* finally面试题
* */
public class Test09 {
    
    
    public static void main(String[] args) {
    
    

        int result = doSome();
        System.out.println(result);

    }
    /*
       java语法规则,有些规则是不能被破坏的
            方法体中的代码必须遵循自上而下顺序依次逐行执行(恒古不变的语法)
       java中还有一条语法规则:
            return语句一旦执行,整个方法必须结束(恒古不变的语法)

     */

    public static int doSome(){
    
    
        int i = 100;

        try{
    
    
            /*
            * 这行代码出现在int i = 100的下面,所以最终结果必须是返回100
            * return语句必须保证是最后执行的,一旦执行,整个方法结束
            * 根据下面反编译之后的代码可以看出:
            *   1、它既按照java代码从上而下执行,返回的值是100(将i赋予另一被变量,返回这个变量)
            *   2、又执行了finally,因为finally是要执行的,return语句一旦执行,方法就得结束
            *       所以底层是这样的方式
            *
            * 规则:  return语句是最后执行的
            *       方法体的代码还得从上而下依次执行
            *
            * 套路了,本来以为是101呢,原来是这个原因
            * */
            return i;
        }finally {
    
    
            i++;
        }

    }
}
/*
* 反编译之后的代码:
* public static int m(){
*   int i = 100;
*   int j = i;
*   i++;
*   return j;
* */



/*
* final finally finalize有什么区别?
* */
public class Test10 {
    
    
    public static void main(String[] args) {
    
    

//        final 关键字,表示最终的,不可变的,
//        修饰的类无法继承,修饰的方法无法覆盖,修饰的变量无法重新赋值

        final int i = 100;

//        finally也是一个关键字,和try联用,在异常处理中使用
//          finally语句块中的语句一定回执行

        try{
    
    

        }finally {
    
    

        }

//        finalize()是Object类中的一个方法,作为方法名出现
//        这个方法是由垃圾回收器GC负责调用的
//        所以finalize是标识符(方法名就是标识符)
//        @Deprecated(since="9")
//        protected void finalize() throws Throwable { }
//    }
                Object obj;

    }
}

import java.io.IOException;

/*
* 之前方法覆盖的时候,有一个问题:
*   重写后的方法不能比重写之前的方法抛出更多的异常,只能更少
* */
public class Test11 {
    
    
    public static void main(String[] args) {
    
    

    }
}
class Animal{
    
    

    public void doSome() {
    
    

    }

}
class Cat extends  Animal{
    
    

    // 子类不抛可以
    /*public void doSome(){
    }*/

    //父类不抛,子类不能抛
   /* public void doSome() throws Exception{

    }*/

    //父类抛,子类可抛,可不抛
  /*  public void doSome() throws Exception{

    }*/


    //父类不抛,子类运行时异常可以抛
    public void doSome() throws RuntimeException{
    
    

    }

    /*异常中的五个关键字:
    * try catch  捕捉
    * finally
    *
    * throw  手动抛异常
    * throws   在方法声明位置上使用,把异常抛给调用者
    * */

}

猜你喜欢

转载自blog.csdn.net/qq_44707513/article/details/109953216