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入门到精通教程
查看: 364|回复: 0

个人对Java异常的简单理解

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

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-2 16:31:23 | 显示全部楼层 |阅读模式

    Java异常的本质是什么?

      从本质上来讲,java异常是一个java对象(继承Object),和一般的java对象一样,封装了一些成员变量和操作,我们可以向操作一般java对象那样去操作java异常对象(我还特地去试了试可不可以使用throw关键字操作一般的java对象,发现编译错误,证明它仅仅是操作异常类的语法)

      从代表的含义上来说:java异常是一种错误情况,是程序不希望出现的现象,但是由于程序本身的设计逻辑和运行的环境等因素,出现异常的情况不可避免,java虚拟机针对不同的异常情况定义了很多异常类,当jvm运行程序发现对应的异常时,将会向外面抛出异常

    java如何处理异常?

      java提供了抛出异常捕获异常的逻辑用于处理异常,当程序抛出异常时,如果不存在捕获异常逻辑,正在执行的方法将停止执行,并将该异常向外抛出,调用该方法的程序进行同样的处理,如果也没有进行捕获,则将一层一层的向外抛出,直到到达当前线程处时将会终止线程的执行。

      处理异常的逻辑是使用try catch finally语句块,这个语句块允许通过对可捕获的异常进行异常处理,类似于一个条件判断一样,当出现异常时我们应该干什么,try catch finally语句块的具体语法规则见其他资料,这里说一下一些容易被忽略的地方:

        1)在try块中和finally块中都存在对同一变量的操作,同时在try块中会返回该变量,具体如下:

    public static int test(){
            int i=10;
            try{
                return i;
            }finally{
                i= i+2;
            }
        }

          则调用该方法将返回一个什么值?按照道理说,finally最后将被执行,应该返回12,实际上返回的是10,这是因为在执行到return语句时会创建一个临时变量用于存放返回值i,执行完finally后再返回临时变量的值,对于基本数据类型因为是值传递,所有finally操作的是方法中的变量而没有操作临时变量的数据,因此不会生效,如果是对象,因为临时变量存放的是对象的变量,因次在finally中的操作将会生效,这里有些问题就是包装类和String类和基本类型一样不会生效,不知道什么原因。

        2)如果是自定义的java类型,则finally中的修改将会生效,具体如下:

    public static data test(){
            data d = new data();
            try{
                return d;
            }finally{
                d.inte=15;
            }
        }
        private static class data{
            public int inte=10;
        }

     java异常的分类

       所有的java异常类均拓展于Throwable类,而Throwable类有两个子类分别是Error和Exception类,Error类表示由于虚拟机自身原因导致的错误,如虚拟机内部错误以及内存溢出等;而Exception则是程序本身的运行情况导致的错误,包含程序逻辑问题以及程序IO交互问题。程序设计基本不怎么关注Error,换句话说出现Error异常除了重启之外基本无能为力,这个是属于jvm本身的问题,而我们更多的关注的Exception类错误。

      Exception类包含两类错误:

        1)RuntimeException(运行时异常),这个是程序设计的逻辑存在问题,说白了就是你的问题,优秀的程序员通常比较少犯这样的错误,新手就不好说了,下面列举常见的RuntimeException:尽量不要使用捕获该异常来解决,应该从设计程序的角度来避免该异常的出现,比如调用一个可能会出现以下异常的方法时,最好是提前做检查后再调用方法

        • NullPointerException:空指针异常,这是由于定义了一个变量在没有实例化之前就调用引起的异常
        • ClassCastException:类型强制转换异常
        • IllegalArgumentException:不合法参数异常
        • ArithmeticException:算数运行异常
        • ArrayStoreException:数组中添加非法对象类型异常
        • ArrayIndexOutOfBoundsException:数组下标越界异常(这个异常比较常见)
        • NegativeArraySizeException:创建数组使用负数来确定数组大小时将会报这个错误
        • NumberFormatException:数字格式化异常,这个通常在将字符串的数字转换为int类型时报的错误,可能是字符串根本不能转换(不是数字或者数字拼接了空格之类)

        2)IOException(IO异常):这一类异常通常是程序与资源打交道或者以接口打交道造成,程序本身并不能控制资源和接口的正确性,因此这一类异常在程序中是允许发生的,通常我们需要捕获这一类异常来确定在发生异常的情况下应该做什么,常见的IOException如下:

        • ClassNotFoundExcpetion:找不到类异常,这个不用多说了,使用反射时经常出现
        • NoClassDefException:类依赖异常,spring的ioc框架常见的异常,一定是某个依赖类没有定义(使用maven管理异常时出现过这种情况,明明已经导入了相关的jar包,但是还是出现了这种异常,通常将本地仓库中对应的依赖异常所对应的包删掉重新加载即可)
        • FileNotFoundException:找不到文件异常

    题外话:java对异常的处理说白了及时能通过程序控制的就尽量不让它出现,不能通过程序控制的就捕获它来处理,此外我们应该记住一些基本的异常,说不准哪天面试官就问你说说几个你常见的异常,如果你说你没见过异常那就搞笑了

     

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-2-4 04:56 , Processed in 0.059996 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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