异常之异常概述
异常:在java语言中,将程序执行中发生的不正常情况称为异常
- 开发过程中的语法错误和逻辑错误不是异常
异常的分类()
异常可以分为Error和Exception
Error
Error:java虚拟机无法解决的严重问题(Error发生后程序员无法作为,这个时候java虚拟机(jvm)已经停止运行了)
eg:
- jvm系统内部错误
- 资源耗尽等严重情况
Error的发生我们一般不编写针对性的代码进行处理(因为这个时候jvm已经停止运行了,程序员无法解决)
Error的举例:
栈溢出:java.lang.StackOverflowError
eg:在main方法中调用main方法(就会一直重复调用main方法,会一直消耗栈内存的空间,也就会发生占内存溢出)
堆溢出:java.lang.OutOfMemoryError(简称为OOM)
eg:Inter [] arr=new Integer[1024 * 1024 * 1024];(由于new对象是在堆内存中开辟空间,而堆内存也是有限的,当在堆内存中创建的空间太多的时候,就会产生堆溢出)
Exception
其他因编程错误或偶然的外在因素导致的一般性问题,可使用针对性的代码进行处理
Exception的举例
空指针访问
试图读取不存在的文件
网络连接中断
数组角标越界
- 广义的异常:Error+Exception
- 狭义的异常:Exception
对于我们遇到的这些错误(也就是异常),我们一般有两种解决的方式:
- 遇到错误就终止程序的运行
- 程序员在编写程序时就考虑到异常的检测,给出错误消息的提醒,以及对异常的处理
java是面向对象的,java中的异常也是一个对象,有专门的异常类,我们要把异常这个对象捕捉住,就相当于你在处理这个异常
-
捕捉异常==处理异常
-
处理异常最理想的时间是在编译期间,但有的错误只有运行时才会发生
在API中有一个类叫做Error,有一个类叫做Exception,它们两个有一个共同的父类Throwable
在异常部分顶级的异常就是Throwable
- Error我们一般不进行处理
这里我们主要讨论Exception
- 而Exception又分为编译时(编译时Exception)异常和运行时异常(运行时Exception)
编译时异常又称为:受检异常(checked)
运行时异常又称为:非受检异常(unchecked)
Throwable类的全类名
java.lang.Throwable
Error类的全类名
java.lang.Error
Exception类的全类名
java.lang.Exception
常见的编译时异常(checked)
---------IOException
---------FileNotFoundException
---------ClassNotFoundException
常见的运行时异常(unchecked)
---------NullPointerException(空指针异常)
---------ArrayIndexOutOfBoundsException(数组下标越界)
---------ClassCastException(类型装换异常)
---------NumberFormatException(格式转换异常)
---------InPutMismatchException(Scanner输入格式不兼容
---------ArithmeticException(算数异常)
面试题举例:常见的一场都有哪些?
- 这里我们举例时就要先分为Error和Exception,然后再在Exception里面分为编译时异常和运行时异常其具体分析
异常的处理:
异常处理方式一
try — catch ---- finally
- 这种方式就相当于狼来了,自己感觉可以解决,直接自己解决掉
- 上面的狼就表示异常
异常的处理方式二
throws + 异常类型
- 这种方式就相当于狼来了,但是自己解决不了,就要用throws把这个问题抛给更厉害的人,让厉害一点的人去再过自己的try ------ catch ------ finally去解决这个狼,如果还是解决不了的话就可以继续将这个狼通过throws抛给更加厉害的人去使用他的try ----- catch -----finally去解决.
- 如果抛到最后还是没能将这个异常解决的话,到最后这个异常还是会跑到main方法中来,最后就会交给java虚拟机(jvm)去解决,然后jvm肯定就会报出异常,然后用户看到异常头都大了
- 上面的狼也表示异常
throws也算成了一种处理异常的方式,但是它本质上并没有解决异常,它只是把这个异常向上报了,也算是处理了,而其实try —catch----finally才是真正的处理方式,它才会去真正的解决异常
java的异常处理:抓抛模型
抓抛模型分为两个过程:
- 抛
- 抓
过程一:抛
程序正在执行的过程中,一旦出现异常就会在出现异常的代码处生成一个异常类的对象,并将此对象抛出
- java是一门面向对象的语言,java将异常也编写成了一个异常类
- 一旦抛出异常类的对象以后,其后的代码将不再执行
过程二:抓
可以理解为异常的处理方式
- try----catch-----finally
- throws