• 19_异常


    异常

    1. 异常的概念

    • 概念:程序在运行过程中出现的不正常现象。出现异常不处理将终止程序运行
    • 异常处理的必要性:任何程序都可能存在大量的未知问题、错误;如果不对这些问题进行正确处理,则可能导致程序的中断,造成不必要的损失
    • 异常处理:Java编程语言使用异常处理机制为程序提供了异常处理的能力

    2. 异常的分类

    • Throwable:可抛出的,一切错误或异常的父类,位于java.lang 包中
      • Error:JVM、硬件、执行逻辑错误、不能手动处理
        • StackOverflowError
        • OutOfMemoryError
      • Exception:程序在运行和配置中产生的问题,可处理
        • RuntimeException:运行时异常,可处理,可不处理
        • CheckedException:检查时异常,必须处理

    3. 异常的产生

    • 当程序在运行时遇到不符合规范的代码或结果时,会产生异常或程序员使用throw关键字手动抛出异常

    (1)常见运行时异常

    类型 说明
    NulPointerException 空指针异常
    ArrayIndexOutOfBoundsException 数组越界异常
    ClassCastException 类型转换异常
    NumberFormatException 数字格式化异常
    ArithmeticException 算数异常

    4. 异常的传递

    • 按照方法的调用链反向传递,如始终没有处理异常,最终会由JVM进行默认异常处理(打印堆栈跟踪信息)

    5. 异常的处理

    • 异常处理机制

      • 抛出异常
      • 捕获异常
    • 异常处理五个关键字:try、catch、finally、throw、throws

      • try:执行可能产生异常的代码
      • catch:捕获异常,并处理
      • finally:无论是否发生异常,代码总能执行
      • throw:手动抛出异常
      • throws:声明方法可能要抛出的各种异常

    (1)异常处理 try...catch

    	Scanner input = new Scanner(System.in);
            int result = 0;
            //Ctrl + Alt + T 捕获异常
            try {
                System.out.println("请输入第一个数字:");
                int num1 = input.nextInt();
                System.out.println("请输入第二个数字:");
                int num2 = input.nextInt();
                result = num1/num2;
            } catch (Exception e) {//捕获Exception:是所有异常的父类
                //处理
                e.printStackTrace();
                //System.out.println(e.getMessage());
            }
            System.out.println("结果是:" + result);
            System.out.println("程序结束。。。");
    

    (2)异常处理 try...catch...finally

    	try {
                //可能出现异常的代码
            } catch (异常类型) {
                //处理异常的相关代码,如:
                //getMessage()
                //printStackTrace() 
            } finally {
                //是否发生异常都会执行,可以释放资源等...
                //唯一不执行的情况:退出java虚拟机
            }
    

    (3)异常处理 多重catch

    	try {
                //可能出现异常的代码
            } catch (异常类型1) {
                //处理异常类型1执行的相关代码                       
            } catch (异常类型2) {
                //处理异常类型2执行的相关代码   
            } catch (异常类型3) {
                //处理异常类型3执行的相关代码   
            }
    		//(1)子类异常在前,父类异常在后
    		//(2)发生异常时按顺序逐个匹配
    		//(3)只执行第一个与异常类型匹配的catch语句
    		//(4)finally根据需要可写可不写
    

    (4)异常处理 try...finally

    • try ...finally 不能捕获异常,仅仅用于当发生异常时,释放资源
    • 一般用在底层代码,只释放资源不做异常处理,把异常向上抛出
    	try {
                //可能出现异常的代码
            }finally {
                //是否发生异常都会执行,可以释放资源等...            
            }
    

    (5)声明异常

    • 如果在一个方法体中抛出了异常,如何通知调用者?
    • throws关键字:声明异常
    • 使用原则:底层代码向上声明或者抛出异常,最上层一定要处理异常,否则程序中断

    (6)抛出异常

    • 除了系统自动抛出异常外,有些问题需要程序员自行抛出异常
    • throw关键字:抛出异常
    • 语法:throw 异常对象

    6. 自定义异常

    • 需继承自Exception或Exception的子类,常用RuntimeException
    • 必要提供的构造方法:
      • 无参构造方法
      • String message参数的构造方法

    7. 方法重写

    • 带有异常声明的方法重写:
      • 方法名、参数列表、返回值类型必须和父类相同
      • 子类的访问修饰符符合父类相同或比父类更宽
      • 子类中的方法,不能抛出比父类更多、更宽的检查时异常
  • 相关阅读:
    SQL2008性能计数器注册表配置单元一致性失败
    win8 下 IIS APPPOOLDefaultAppPool 登录失败的解决方法
    Win8 x64环境下VS2010 C#工程运行报错:没有注册类 (异常来自 HRESULT:0x80040154
    编辑距离
    UVA 147 Dp(完全背包)
    poj 1141 Brackets Sequence
    hdu2612 Find a way BFS
    I
    javascript--运算符
    javascript--变量
  • 原文地址:https://www.cnblogs.com/MRASdoubleZ/p/14461103.html
Copyright © 2020-2023  润新知