ACAC 异常处理(1)


/*
*
* 处理异常第一种方式:
*       在方法是声明的位置上使用throws关键字抛出,谁调用这个方法,就抛给谁
*   第二种方式:
*       使用try..catch语句对异常进行捕捉
*       不在上抛了,自己处理了
*
* 注意:只要代码异常采用上抛,没有捕捉,则此方法的后续代码不会执行,此方法结束
*       try语句块中的某一行出现异常,该行后面的代码不会执行
*       try..catch捕捉异常后,后续代码(指的是try..catch语句块)可以执行
* */

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

public class Test03 {
    
    

    public static void main(String[] args) {
    
    


        //这是算输异常,属于运行时异常,你这样写,编译器没有报错,可以处理,也可不处

        try{
    
    
            System.out.println(10 / 0);

        }catch (ArithmeticException s){
    
    

            System.out.println("算术异常");
        }

        /*
        * 一般不建议在main方法中使用throws,如果这个异常真的发生了,main方法一定会抛给JVM,JVM只有终止程序
        * 异常处理机制的作用是增强程序的健壮性,怎么能做到,异常发生了叶不影响程序的执行
        * 建议main方法中的异常使用try..catch进行捕捉,main方法就不再上报了
        * */
        System.out.println("main begin");

        try {
    
    

            //尝试执行
            m1();

        } catch (FileNotFoundException e) {
    
    

            //这个分支可以使用e引用,e保存的是那个new出来的异常对象的内存地址
            //只要捕捉,就不会上抛,catch分支中处理异常
            //catch是捕捉异常之后走的分支

            System.out.println("文件不存在,可能路径错误,也可能该文件被删除了");
            System.out.println(e);
//            java.io.FileNotFoundException: I:\project\疑惑问题.txs (系统找不到指定的文件。)

        }

        //try catch把异常抓住后,这里的代码就会继续执行,若是上抛的,则代码不再向异常的下面执行
        System.out.println("main over");

    }

    public static void m1() throws FileNotFoundException {
    
    
        System.out.println("m1 begin");
        m2();
        System.out.println("m1 over");
    }

    public static void m2() throws FileNotFoundException {
    
    

        /*
        * 这个位置抛别的异常不行ClassCastException,
        * 但是:
        *   1、可以抛别的和它本身 throws ClassCastException,FileNotFoundException 注意用逗号隔开,不需再写throws
        *   2、可以抛他的父类throws IOException
        *   3、也可以抛他的父类的父类,比他大的都行 ,因为他的父类包括FileNotFoundException
         * */
        System.out.println("m2 begin");
        m3();
        System.out.println("m2 over");
    }

    public static void m3() throws FileNotFoundException {
    
    
//        创建一个输入流,该流指向一个文件
        /*
        * 问什么会出现编译报错呢?
        *       public FileInputStream(String name) throws FileNotFoundException
        *1、 这是构造方法声明位置上有 throws FileNotFoundException
        *2、 通过这个类看到FileNotFoundException 的父类是 IOException ,IOException的父类是Exception
        *
        * 结论:得知FileNotFoundException是编译时异常,需要进行预处理,不处理编译器就报错
         */
        System.out.println("m3 begin ");
        new FileInputStream("I:\\project\\疑惑问题.txs");
        System.out.println("m3 over");

        System.out.println("出了异常,这里还会执行吗??????");
    }


}

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

/*
* 深入try..catch
*       1、catch后面的()可以是具体的异常类型,也可以是该异常类型的父类型
*       2、catch可以写多个,建议捕捉异常时,精确地一个一个地处理,这样有利于程序调试
*       3、catch写多个的时候,从上到下,必须遵循从小到大,否则报错
*
* 以后开发中:
*       希望调用者知道(如你写了一个方法,希望其他人去处理这个异常),就用throws(编译时,受检,受控)
*       其他情况用捕捉(运行时,未受检,非受控)
*
* */
public class Test04 {
    
    
    public static void main(String[] args) throws FileNotFoundException {
    
    

       /* try {
            new FileInputStream("I:\\project\\疑惑问题.txt");
            System.out.println("如果发生异常的话,这行代码就不执行");

        }catch (FileNotFoundException e){
            System.out.println("发生异常,找不到文件");
        }*/
        try {
    
    
            FileInputStream fis = new FileInputStream("I:\\project\\疑惑问题.txt");
            System.out.println("如果发生异常,你将不会看到这句话");
            System.out.println(100 / 0);

        //这样写是JDK8的新特性
        }catch ( FileNotFoundException  | ArithmeticException a ){
    
    
            //所有的异常都走这个分支
            //IOException e = new FileNotFoundException(); 相当于多态
            System.out.println("发生异常,找不到文件,或者数学异常");

        }
    }
}

/*
* 异常对象有两个重要的方法:
*   获取异常简单的描述信息:
*       String msg = exception.getMessage();
*
*   打印异常追踪的堆栈信息
*       exception.printStackTrace()
* */
public class Test05 {
    
    
    public static void main(String[] args) {
    
    


        /*
        * 这里只是为了测试getMessage()方法和printStackTrace()方法
        * 只new了异常对象,但没有将异常对象抛出,JVM认为这是一个普通的java对象
        * */

        NullPointerException e = new NullPointerException("空指针异常hahahahah");
//        throw e;手动抛异常的,在后面


        //获取异常简单描述信息:这个信息实际上就是构造方法上是String参数
        String msg = e.getMessage();
        System.out.println(msg);

        //打印异常堆栈信息
        //java后台打印异常堆栈追踪信息的时候,采用了异步线程的方式打印的
        e.printStackTrace();

        //双线程的,其实e.printStackTrace();的输出应该在hello world上的,不一定

        System.out.println("hello world");
    }
}



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

/*
* 异常对象的两个方法:
*   String msg = e.getMessage():
*   e.printStackTrace();
*
* 查看异常的追踪信息,应该怎么看,可以快速的调试?
*   从上往下一行一行看,不看Sun的代码
*   主要问题在自己写的代码上(看包名就能看出来)
*
*
* */

public class Test06 {
    
    
    public static void main(String[] args) {
    
    

        try {
    
    
            m1();
        } catch (FileNotFoundException e) {
    
    
            //打印异常堆栈追踪信息
            //在实际开发中,建议使用这个,

            e.printStackTrace();
            //这行代码如果不写,出了异常也不知道,一般用这个

            //获取异常的简单描述信息,这个方法不全
            System.out.println(e.getMessage());


           /*
            java.io.FileNotFoundException: I:\project\疑惑问题.tx (系统找不到指定的文件。)
            at java.base/java.io.FileInputStream.open0(Native Method)
            at java.base/java.io.FileInputStream.open(FileInputStream.java:211)
            at java.base/java.io.FileInputStream.<init>(FileInputStream.java:153)
            at java.base/java.io.FileInputStream.<init>(FileInputStream.java:108)
            at UML.Test06.m3(Test06.java:34)
            at UML.Test06.m2(Test06.java:29)
            at UML.Test06.m1(Test06.java:25)
            at UML.Test06.main(Test06.java:15)
            34行出问题,导致29行出问题、导致25,导致15
            */

        }
        //这里程序不耽误执行,很健壮(服务器不会因为遇到异常而宕机,死机)
        System.out.println("后面程序可以执行");
    }

    private static void m1() throws FileNotFoundException {
    
    
        m2();
    }

    private static void m2() throws FileNotFoundException {
    
    
        m3();
    }

    private static void m3() throws FileNotFoundException {
    
    

        new FileInputStream("I:\\project\\疑惑问题.tx");

    }

}

在这里插入代码片

猜你喜欢

转载自blog.csdn.net/qq_44707513/article/details/109953158
今日推荐