玩命加载中 . . .

Error异常信息(23)


Error异常信息

异常处理

throws

  1. 作用:如果在构造方法声明位置上使用 throws(向上抛),则谁被调用需要使用throws或者try catch。

  2. 注意:throws只能往上报但是不能解决根本问题

        /**
         * 异常
         * throws 和 try catch
         * throws:
         * 1.如果在构造方法声明位置上使用 throws(向上抛)则谁调用它谁就要解决这个问题或者继续往上抛出才可以运行,
         * 2.严格意义上来说throws不能够解决error报错,throws只能网上报但是不能够解决根本问题
         * try catch:
         * 1.
         */
        public static void m1() throws FileNotFoundException {
            m2();
        }
        public static void m2() throws FileNotFoundException {
            m3();
        }
        public static void m3() throws FileNotFoundException {
            new FileInputStream("C://txt.txt");
            /*
            * FileInputstream构造方法声明位置上使用 throws(向上抛)
            * java: 未报告的异常错误java.io.FileNotFoundException; 必须对其进行捕获或声明以便抛出
            */
        }
    
        public static void main(String[] args) throws FileNotFoundException {
            try {
                m1();
            }catch (FileNotFoundException e) {}
            System.out.println("可以继续往下执行~~");
            /*
            * 在程序运行过程中发生了 FilNotFoundException类型的异常
            * JVM为我们创建了一个FilNotFoundException类型的对象
            * 该对象中携带以下的信息。
            * 负责将该对象的信息打印到控制台并且JVM停掉了程序的运行
            *   Exception in thread "main" java.io.FileNotFoundException: C:\txt.txt (系统找不到指定的文件。)
                at java.base/java.io.FileInputStream.open0(Native Method)
                at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
                at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
                at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)
                at javase2.day02.javareview02.ErrorTest01.m3(ErrorTest01.java:23)
                at javase2.day02.javareview02.ErrorTest01.m2(ErrorTest01.java:20)
                at javase2.day02.javareview02.ErrorTest01.m1(ErrorTest01.java:17)
                at javase2.day02.javareview02.ErrorTest01.main(ErrorTest01.java:30)
            */
        }
    

try catch

  1. catch可以写多个,但是必须从上到下,从小到大捕捉,不然会报异常。

  2. 如果在try语句块中首次出现异常则在try语句块中后面语句不在执行。

  3. catch的参数变量中的Object的toString方法重写了,不是一个存储地址,而是一个字符串。

  4. 语法:

  try {
      可能出现异常的代码;
  } catch (异常类型1 变量) {
      处理异常代码;
  }catch (异常类型2 变量) {
      处理异常代码;
  }
//       情况一.
        /*try {
            FileInputStream fis = new FileInputStream("abc");
            // 以上FileInputStreamerror属于FileNotFoundException错误
            fis.read();
            // 以上fis.read()属于IOException错误
            // 因为FileNotFoundException属于IOException的子类
            // 如果解决一个问题则会报错:
            // java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出
        } catch (FileNotFoundException e) {
            System.out.println("执行1111");
        } catch (IOException e) {
            System.out.println("执行2222");
        }*/
//       情况二.
        /*try {
            FileInputStream fis = new FileInputStream("abc");
            // 以上FileInputStreamerror属于FileNotFoundException错误
            // 注意:FileNotFoundException属于IOException的子类
            fis.read();
            // 以上fis.read()属于IOException错误
        } catch (IOException e) {
            System.out.println("执行2222");
        } catch (FileNotFoundException e) {
            System.out.println("执行1111");
        }*/
        /*
         * 报错:java: 已捕获到异常错误java.io.FileNotFoundException
         * catch只能从小(子类)到大(父类)处理异常
         * 如果从大(父类)到小(子类)会报错
         * */
//       情况三.
        try {
            FileInputStream fis = new FileInputStream("abc");
            // 如果在try语句块中首次出现异常则在try语句块中后面语句不在执行~
            System.out.println("报错");
            fis.read();
        } catch (FileNotFoundException e) {
            System.out.println(e);
            System.out.println("执行1111");
        } catch (IOException e) {
            System.out.println("执行2222");
        }
        /*
         * 报错:java: 已捕获到异常错误java.io.FileNotFoundException
         * catch只能从小(子类)到大(父类)处理异常
         * 如果从大(父类)到小(子类)会报错
         * */

throws与try catch区别:

  1. (throws)实际例子:小王是公司小职员因操作不当让公司赔了100W,则小王给项目经理报,而项目经理给部门经理报,部门经理给董事长报,董事长宣布公司破产。其中:部门经理知道后将此事一直未的到解决直到报给董事长(JVM)就相当于直接报给JVM虚拟机停止运行。
  2. (try catch)实际例子:小王是公司小职员因操作不当让公司赔了100W,则小王给项目经理报,而项目经理知道后给部门经理报,部门经理知道后将此事解决了,则不需要往上级报了只需要继续工作即可。其中:部门经理知道后将此事解决就是try catch

getMessage() 与 printStackTrace()方法

  1. 取得异常描述信息:getMessage()

  2. 取得异常的堆栈信息(比较适合于程序调试阶段):printStackTrace()

  3. 代码示例:

    try {
                FileInputStream fil = new FileInputStream("c://txt.txt");
            }catch (FileNotFoundException e) {
                e.printStackTrace();
                /*
                * java.io.FileNotFoundException: c:\txt.txt (系统找不到指定的文件。)
                at java.base/java.io.FileInputStream.open0(Native Method)
                at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
                at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
                at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)
                at javase2.day02.javareview02.ErrorTest03.main(ErrorTest03.java:10)
                * */
                //以下输出的是上面printStackTrace错误信息的一部分
                String s = e.getMessage();
                System.out.print(s);
                // c:\txt.txt (系统找不到指定的文件。)
                System.out.println("Hello Wrold!!");
            }
    

finllay语句块

  1. finally语句块可以直接和try语句块联用。try… finally…

  2. try…catch…finally…也可以

  3. 在finally语句块中的代码是一定会执行的

  4. 在实际开发应用场景:finally语句块是一定会执行的,所以通常在程序中为了保证某资源一定会释放,所以一般在finally语句块中释放资源。

        public static void main(String[] args) {
            // 情况一
            /*try {
                System.out.println("执行结果1~~");
                return;
            }finally {
                System.out.println("执行结果2~~");
            }*/
            /*
             * 以上程序的执行顺序:
             * 1. 先执行try语句块中的System
             * 2. 在执行finally语句块中的System
             * 3. 最后执行try语句块中的return结束main方法
             * 注意:一旦出现return则该方法自动关闭,除特殊情况如:finally语句块
             */
    
            // 情况二
            System.out.println(m1());
        }
    
        public static int m1() {
            int i = 0;
            try {
                i = 10;
                return i;
            } finally {
                i++;
            }
            /*以上程序的执行顺序:
             * 1. 初始化i变量
             * 2. 执行try语句中的i = 10 并将i变量存储给temp变量
             * 3. return temp变量
             * 4. 执行finally中的i++
             */
            /*
                int i = 0;
                try{
                    i = 10;
                    int temp = i;
                    return temp;
                }finally {
                    i++;
                }
            */
    
        }
    

文章作者: 小靳同学
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小靳同学 !
评论
  目录