zoukankan      html  css  js  c++  java
  • Java checked 异常 和 RuntimeException(运行时异常)

    目录

       一、运行时异常
    
         1、什么是RuntimeExceptioin
         2、运行时异常的特点
         3、如何运用运行时异常
    
       二、运行时异常和ckecked异常的区别
    
         1、机制上
         2、逻辑上  




    一、运行时异常

    1、什么是运行时异常

    程序在运行过程中出现的异常,RumtimeException 是 Exception 的一个子类 
    我们可以查看Java API 文档

    贴张示意图 

    2、运行异常的特点

    一般来说,我们在方法体内出现异常,我们用throw 关键字 将 异常对象或 异常对象的引用抛出,如果当前方法无法处理异常,那么必须在方法的参数列表后方法体前 必须 用 throws 声明异常所属类,交给调用者去处理。但是RuntimeException是非常特殊的子类,你可以不用throw和throws,哪怕你throw了,也没必要thtows,即使你throws了,调用者也没必要try-catch

    1> 如果在函数内容中抛出该类异常或其子类异常,函数上可以不用声明,编译一样通过

    2> 如果在函数上声明该异常,调用者可以不同处理(try-catch),编译一样通过

    为什么不用声明 ?

    之所以不用在函数上声明,是因为不需要让调用者处理,当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况,希望程序停止后由程序员对代码进行修正。

    3、如何运用运行时异常

    自定义异常时,如果该异常的发生,无法继续进行运行,就让自定义异常类继承RuntimeException

    再贴一张简单示意图 Object 中的 wait(long timeout)方法,继续查看Java API 文档 对该方法的描述

    二、运行时异常和ckecked异常的区别

    对于异常分两种:检查异常和非检查异常(运行时异常)

    检查异常 : 编译时被检测的异常 (throw后,方法有能力处理就try-catch处理,没能力处理就必须throws)。编译不通过,检查语法(其实就是throw和throws的配套使用)。

    运行时异常 : 编译时不被检查的异常(运行时异常。RuntimeException及其子类)。编译通过。

    1、机制上

    主要表现在以下两个方面 :
    (1)如何定义方法
    (2)如何处理抛出的异常

    运行时异常,不需要用throws 声明抛出 异常对象所属类,也可以不用throw 抛出异常对象或异常引用。对于调用该方法,也不需要放于 try-catch 代码块中。(为什么 ? 如果你捕获它,就会冒这么一个风险:程序代码错误被掩盖在运行中无法察觉)

    而检查异常 : 一旦 用throw 抛出异常,如果当前方法 可处理异常,那么直接在该方法内用try-catch 去处理。如果当前方法不具备处理该异常的能力,那么就必须在 参数列表后方法体前用 throws 声明 异常 所属类,交给调用该方法的 调用者(方法) 去处理 。

    2、逻辑上

    从逻辑的角度来看, checked 异常 和 RuntimeException 有着不同的使用目的,检查性异常 用来指示 一种调用方能够直接处理的异常情况(例如: 用户输入错误,程序可以直接捕获并处理,提示用户输入错误), 而RuntimeException 是用来指 调用方 本身无法 处理或回复 的程序错误(例如,你封装个库给别人用,当别人调用你库中某个方法是,需要传入某些参数,如果用户传入的参数不合法,你自己没办法处理,那么刺客你抛出的就应该是运行时异常)。

    我个人感觉,RuntimeException 跟OC 中的 断言(NSAlert) 有点像哦。

    进一步思考 : 前面的知识点有降到,携带参数的构造方法既可以为对象赋初始值,还可以为对象 赋一个合理的值。例如,初始化一个长方形对象,用构造方法给定 width 和 length ,我们可以在构造方法里面判断 长 宽 值的合理性,但是如果此时你初始化这个对象成功后,你调用 求面积的方法,返回一个 值,那么这个值 是异常值。按照所学的知识,我们一般会在求面积的方法,判断值的合理性,如果不合理抛出异常。但是,反过来想,如果我一开始让你传入 的 width 和 length 就抛出异常呢,这个直接让你初始化对象不成功 是不是好点。因为你有可能不知道 我 求面积的方法是怎么实现的,就算我给你抛出异常,你也不知道如何处理。(通过这点,我们也了解到一个小知识点,构造方法也是可以抛出异常的,而且,抛出异常的类型通常是运行时异常)


    原文:https://blog.csdn.net/qq_18505715/article/details/76696439 

  • 相关阅读:
    配置vCenter Server Appliance 6.7
    部署vCenter Server Appliance 6.7
    罗克韦尔 Allen-Bradley MicroLogix 1400 查看、设置IP
    centos7 部署 docker compose
    centos7 部署 docker ce
    docker 定时清理none镜像
    [CLR via C#]5.1 基元类型
    [CLR via C#]4. 类型基础及类型、对象、栈和堆运行时的相互联系
    [CLR via C#]1.6 Framework类库~1.9与非托管代码的互操作性
    [CLR via C#]1.5 本地代码生成器:NGen.exe
  • 原文地址:https://www.cnblogs.com/panchanggui/p/10374270.html
Copyright © 2011-2022 走看看