zoukankan      html  css  js  c++  java
  • Day09 异常

    异常Exception

    什么是异常

    • 异常是指程序允许中出现的不期而至的各种状况
    • 异常发生在程序运行期间,他影响了正常的程序执行流程
    • 三种类型的异常
      • 检查性异常:最具代表的检查性异常时用户错误或问题引起的异常,这是程序员无法预见的。例如打开一个文件但是文件不存在。
      • 运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
      • 错误ERROR:错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就放生了,它们在编译也查不到的。

    异常的体系结构

    • Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。
    • Java API 中已经定义了许多异常类,这些异常类分为2个大类,错误Error和异常Exception。

    Java异常处理机制

    • 抛出异常

    • 捕获异常

    • 异常处理5个关键字

      • try catch finally throw throws

        public class Test {
        
            public static void main(String[] args) {
                int a=1;
                int b=0;
        
                /*try {//监控区域
                    System.out.println(a/b);
                }catch (ArithmeticException e){//捕获异常
                    // catch(中参数是想要捕获的异常类型!最高类型是 Throwable)
                    //catch 可以有多个
                    System.out.println("b不能为0" );
                }finally {//处理善后工作   可选
                    System.out.println("finally");
                }*/
                //假设要捕获多个异常:从小到大
                try {//监控区域
                    System.out.println(a/b);
                }catch (Error e){//捕获异常
                    System.out.println("Error" );
                } catch (Exception e){//捕获异常
                    System.out.println("Exception" );
                }catch (Throwable e){//捕获异常
                    System.out.println("Throwable" );
                } finally {//处理善后工作   可选
                    System.out.println("finally");
                }
            }
        }
        
        public class Test02 {
            public static void main(String[] args) {
                int a=1;
                int b=0;
                // 选中要捕获的代码 win+ctrl+alt+t
                try {
                    System.out.println(a/b);
                } catch (Exception e) {
                    e.printStackTrace();//打印错误信息
                } finally {
                }
            }
        }
        
        public class Test03 {
            public static void main(String[] args) {
                new Test03().test(1,0);
                try {
                    new Test03().test(1,0);
                } catch (ArithmeticException e) {
                    e.printStackTrace();
                }
            }
        
            //假设此方法不能处理这个异常,方法上抛出异常 throws
            public  void test(int a,int b) throws ArithmeticException{
                if (b==0){//throw 用在方法中
                    throw new ArithmeticException();//主动的抛出异常
                }
            }
        }
        

    自定义异常

    • 使用Java内置的异常类可以描述在变成时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需要继承Exception类即可。

    • 在程序中使用自定义异常类,大体可分为以下几个步骤

      1. 创建自定义异常类

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

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

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

        //自定义异常
        public class MyException extends Exception{
        
            //传递数字,如果数字大于10就抛出异常
            private int detail;
        
            public MyException(int a){
                detail =a;
            }
        
            @Override
            public String toString() {
                return "MyException{" + detail + '}';
            }
        }
        
        public class Test04 {
        
            static void test04(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 {
                    test04(11);
                } catch (MyException e) {
                    //可以编写处理异常的方法
                    System.out.println("MyException=>"+e);
                }
            }
        }
        

    总结

    • 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
    • 在多重catch块后面,可以加要给catch(Exception)来处理可能会遗漏的异常
    • 对于不确定的代码,也可以加上try-catch,处理潜在的异常
    • 尽量去处理异常,切忌只是简单地调用printStackTrace()去打印输出
    • 具体如何处理异常,要根据不同的业务需求和异常类型去决定
    • 尽量添加finally语句块去释放占用的资源
  • 相关阅读:
    设计模式——装饰器模式
    设计模式——适配器模式
    Java IO概述
    Java中的注解
    痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(3)- Serial Downloader模式(sdphost/MfgTool)
    痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(2)- Boot配置(BOOT Pin/eFUSE)
    痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(1)- Boot简介
    痞子衡嵌入式:ARM Cortex-M内核那些事(5)- 一表搜罗指令集
    痞子衡嵌入式:SEGGER J-Link仿真器硬件版本变迁
    痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU特性那些事(4)- RT105x选型
  • 原文地址:https://www.cnblogs.com/zhaojiaxiaomei1/p/15353561.html
Copyright © 2011-2022 走看看