• Java异常机制


    9.异常机制

    Exception

    异常发生在程序运行期间,影响了程序正常的执行流程

    三种类型的异常:

      检查性异常:用户错误或者问题引起的异常(程序员无法预见)

      运行时异常:运行时异常可以在编译时被忽略

      错误error:脱离程序员控制的问题。常在代码中忽略

    Java把异常当作对象处理,并定义一个基类java.lang.Throwable作为所有异常的超类。

    异常分为两大类:Error&Exception

    9.1Error

      1、Error类对象由Java虚拟机生成并抛出。(大多数错误与代码编写者无关)

      2、Java虚拟机运行错误;当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些一擦汗给你发生时Java虚拟机一般会选择线程终止;

      3、还有发生在虚拟机执行应用时,如类定义错误、连接错误。

    9.2Exception

      1、Exception分支中有一个重要的子类RuntimeException(运行时异常)

        -ArrayIndexOutOfBoundsException(数组下标越界异常)

        -NullPointException(空指针异常)

        -ArithmeticException(算数异常)

        -MissingResourceException(丢失异常)

        -ClassNotFoundException(找不到类异常)

      2、程序逻辑错误引起的;尽量规避

      3、Error是灾难性致命的错误,程序无法控制和处理的,出现时会终止线程;Exception通常可以被程序处理的,并且在程序中尽可能取处理这些异常。

    9.3异常处理

      抛出异常

      捕获异常

      关键词:try、catch、finally、throw、throws

     package com.oop.exception;
     ​
     public class Demo01_error {
         public static void main(String[] args) {
     ​
             int a = 1;
             int b = 0;
     ​
             //多异常捕获:从小到大范围书写!
             try{
                 //try监控区域
                 System.out.println(a/b);
     //           new Demo01_error().a();
            }catch (ArithmeticException e){
                 System.out.println("除数不能为零");
            }catch (Exception e){
                 System.out.println("Exception异常");
            }catch (Throwable e){
                 //catch捕获异常(参数==》想要捕获的异常类型,最高的就是Throwable)
                 System.out.println("Throwable异常");
            }finally {
                 //处理善后工作,无论怎样都会走finally代码块(可以不要)
                 System.out.println("finally");
            }
        }
     ​
         public void a(){b();}
         public void b(){a();}
     }
     ​
     package com.oop.exception;
     ​
     public class Demo02_error {
         public static void main(String[] args) {
             try {
                 new Demo02_error().test(1,0);
            } catch (ArithmeticException e) {
                 e.printStackTrace();
            }
        }
         public void test(int a ,int b) throws ArithmeticException{  //throws 在方法上抛出
             if (b==0){
                 throw new ArithmeticException(); //主动抛出异常 一般在方法内使用
            }
     ​
             System.out.println(a/b);
     ​
        }
     }
     ​
     /*
     *       int a = 1;
             int b = 0;
             //快捷键 Ctrl+Alt+t 自动生成包裹代码块
             try {
     //           System.out.println(a/b);
             } catch (Exception e) {
                 e.printStackTrace();//打印错误栈信息
             } finally {
             }
     ​
     * */

    9.4自定义异常

    用户自定义异常需要继承Exception类即可

    步骤:

      1、创建自定义异常类

      2、在方法中通过throw关键字抛出异常对象

      3、如果在当前抛出异常的方法中处理异常,可以使用try catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作

      4、在出现异常方法的调用者中捕获并处理异常

     package com.oop.exception;
     ​
     //自定义异常类
     public class MyException extends Exception{
         //传递数字
         private int detail;
     ​
         public MyException(int a) {
             this.detail = a;
        }
     ​
         //异常的打印信息
         @Override
         public String toString() {
             return "MyException{" +
                     "detail=" + detail +
                     '}';
        }
     }
     package com.oop.exception;
     ​
     public class Test {
     ​
         //可能会存在异常的方法
         static void test(int a) throws MyException{
             System.out.println("传递的参数为:"+a);
     ​
             if(a>10){
                 throw new MyException(a);
            }
             System.out.println("OK!");
        }
     ​
         public static void main(String[] args) {
             try {
                 test(11);
            } catch (MyException e) {
                 System.out.println("a > 10 不符合"+e);
            } finally {
                 System.out.println("======END=======");
            }
        }
     }

    9.5总结

      -处理运行时异常时,采用逻辑合理规避同时辅助try catch处理

      -在多重catch后面,可以加一个catch(Exception)来处理可能遗漏的异常

      -对于不确定的代码加上try catch进行处理潜在的异常

      -切忌简单的调用printStackTrace()去打印输出

      -具体如何处理异常,根据不同业务规则和异常类型去决定

      -尽量添加finally语句块去释放资源

  • 相关阅读:
    ArcEngine9.3没有原生支持64位,而是以32位兼容方式运行
    记一次IIS应用程序域崩溃的原因
    切换添加[置顶] Behaviors扩展根据Pivot的item自动切换AppBar
    参数类型11g_job执行带参数的procedure
    元素返回[Python]python算法入门 栈(stack)
    模型案例复杂性思考
    执行目录glassfish不能远程登录问题
    文件目录IBM的LPI复习资料之LPI101Topic103 :GNU和Unix命令(3)文件和目录管理
    企业网站[正能量系列]失业的程序员(一)
    缓冲区方法你有被stringstream坑过吗?
  • 原文地址:https://www.cnblogs.com/joey-413/p/13234861.html
Copyright © 2020-2023  润新知