Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 348|回复: 0

浅析Java异常

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-11 13:48:41 | 显示全部楼层 |阅读模式

    1、什么是异常

    结构不佳的代码不能运行,这是Java的基本理念。

    发现错误的理想时机是在编译期。然而,编译器并不能发现所有的错误,余下的问题就需要在程序运行时解决。这就需要错误能通过某种方式,把适当的信息传递给特定的接收者处理。Java中的异常处理的目的在于通过使用少量的代码来简化大型、可靠的程序的生成,通过此方式让你的应用中没有未处理的错误,而且它还带来了一个明显的好处:降低错误处理代码的复杂度。

    异常,根据字面理解,有意外之意。把它置于代码层面来理解,即阻止了当前方法或作用域继续执行。

    在Java中,异常被当做对象来处理,其基类是Throwable。

    2、Java中的异常类型

    Java从Throwable直接派生出Exception和Error。其中Exception是可以抛出的基本类型,在Java类库、方法以及运行时故障中都可能抛出Exception型异常;Error表示编译时和系统错误。异常类的结构层次图如下:

    典型的RuntimeException包括NullPointerException, IndexOutOfBoundsException, IllegalArgumentException等;非RuntimeException包括IOException, ClassNotFoundException等。

    而按照编译器检查方式划分,异常又可以分为检查型异常(CheckedException)和非检查型异常(UncheckedException)。Error和RuntimeException合起来称为UncheckedException,之所以这么称呼,是因为编译器不检查方法是否处理或者抛出这两种类型的异常,因此编译期间出现这种类型的异常也不会报错,默认由虚拟机提供处理方式。除了Error和RuntimeException这两种类型的异常外,其它的异常都称为Checked异常。

    3、Java如何处理异常

    3.1 try-catch, try-finally, try-catch-finally

    对于checked类型异常,我们要么对它进行处理,要么在方法头使用throws抛出。

    public static void createFile() throws IOException{
        File file = new File("C:/test.txt");
        if(!file.exists()){
                file.createNewFile();
        }
    }
    public static void main(String[] args) {
        try {
            createFile();
        } catch (IOException ex) {
            // handle exception here
        }
    }

    关于catch需要注意的几点:

    1)、参数的异常类型必须是Throwable类或者其子类。

    2)、从上往下的catch语句,其参数类型必须按照从子类到父类顺序,因为一旦匹配到一个类型,就会忽略往后的catch。比如IOException必须放到Exception前面,否则编译器会报错。

    3)、可以有一个或者多个catch语句,甚至如果有finally语句的情况下,可以没有catch语句,如try-finally。

    想要捕获多个异常,可以使用多个catch语句,JDK7以后提供了另外一种方式:多重捕获(multi-catch)。

    try{
        // other code
    } catch (IOException | SQLException ex) {
        throw ex;  
    }  

    4)、不要忽略异常。空的catch块会使异常达不到应有的目的,除非诸如关闭FileInputStream的时候,因为你还没有改变文件的状态,因此不必执行任何恢复动作,并且已经从文件中读取到所需要的信息,因此不用终止正在进行的操作。

    关于finally需要注意的几点:

    1)、finally中的代码总是会被执行,除非在执行try或者catch语句时虚拟机退出(System.exit(1))。

    2)、finally块可以做一些资源清理工作,如关闭文件、关闭游标等操作。

    3)、finally块不是必须的。

    另外,如果在try和finally块中都执行了return语句,最终返回的将是finally中的return值。

    3.2 异常链

    常常想要在捕获一个异常后抛出另外一个异常,并且希望把原始异常信息保存下来,这就是异常链。在JDK1.4以后,Throwable子类在构造器中可以接受一个cause对象作为参数,表示原始异常,通过这样把原始异常传递给新的异常,使得即使在当前位置创建并抛出了新的异常,也能通过这个异常链追踪到异常最初发生的位置。

    但在Throwable子类中,只有Error, Exception, RuntimeException三类异常类提供了带cause参数的构造器,其它类型的异常则需要通过initCause()方法。例如定义了CustomException类,可以这样使用:

    CustomException cmex = new CustomException();
    cmex.initCause(new NullPointerException);
    throw cmex;

    这样一来,CustomException继承自Exception或RuntimeException,就属于自定义异常了。

    一般来说,自定义异常的作用有以下情形:

    1)、将检查型异常转换为非检查型异常。

    2)、在产生异常时封装上下文信息、定义异常码、收集环境对象,有利于信息的传递。

    4、异常使用指南

    1)、在知道该如何处理的情况下才捕获异常。

    2)、自定义异常类型,用以封装所有的检查型异常。

    3)、在程序的边界进行异常捕获。如服务端相应客户端的请求,在出口处catch内部有可能产生的异常,并统一throw一个封装过的异常给客户端,免得暴露服务端敏感信息。

    4)、只针对异常的情况才使用异常。不要在所有的代码中习惯性地使用try-catch,因为这会影响性能。

    5)、抛出与抽象相对的异常。如果方法抛出的异常与它执行的任务没有明显的联系,这种情形会使人不知所措。为了避免这个问题,更高层的实现应该捕获低层的异常,同时抛出可以按照高层抽象进行解释的异常,这种做法被称为异常转译(exception translation),如下:

    try{
        // use lower-level abstraction to do our bidding
    } catch(LowerLevelException ex){
        throw new HigherLevelException(...);
    }

    另外一种特殊的异常转译称为异常链,上面已作描述。如果低层的异常对于调试导致高层异常的问题非常有帮助,使用异常链就很合适。高层的异常提供访问方法(Throwable.getCause)来获得低层的异常。

    6)、每个方法抛出的异常要有文档描述。利用Javadoc的@throws标记,记录抛出每个异常的条件。如果一个方法可能抛出多个异常,不要使用这些异常类的某个超类。如不要声明一个方法“throws Exception”或“throws Throwable”,这将没有任何指导信息。

     

     

    参考:

    Java的Exception和Error面试题10问10答

    去除Java的受检异常?

    有关JAVA异常和错误(ERROR)的处理

    Java异常处理和设计

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-2 09:49 , Processed in 0.062579 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表