1、什么是异常?
在java中,有两种错误,一种是语法错误,这种错误在java文件编译成class文件时,就会造成编译失败,另一种就是在程序运行途中出现的错误。java的异常就是对运行时出现的错误进行处理的一种机制。
2、为什么需要异常?
2.1、对于一些程序来说,并不是一定会发生的错误,如果没有异常处理的话,很难知道问题出在哪里,对于排查问题来说是比较不友好的。
2.2、如果没有异常处理,那么程序员就需要提前对可能发生的异常进行提前预判,并进行一系列的规避异常的操作,这样子代码会变得很繁杂,很难进行代码走读,反之,代码会更加优雅,程序也会更健壮。
3、异常类的分类
java中所有异常的父类是Throwable
二级分类:
Error 错误类 这种类型对于程序员来说一般是不可控制的,也是必然会出现的问题,是在程序运行前就会被抛出的。是不允许在运行期间出现的。
Exception 异常类 这种一般都是在程序运行期间出现的,对于程序而言并不一定会出现问题的。
4、java中异常的处理机制
对于java而言,如果出现了异常,那么程序会停止,并将这个时候的堆,栈信息发送出去。由于栈中会有程序计数器和方法返回地址,那么在发生问题时,程序可以从错误发生的地方反查回每一个方法调用,从而层层反馈出问题出现的部位。
5、java 提供的异常捕捉机制
java 提供了 try,catch, finally 来进行java异常的捕捉,
try 关键字用于包裹需要进行异常捕捉的代码。
catch 用于对异常进行自定义处理,可以选择将异常转成自定义异常抛出,或者自己打印出异常。
finally 用于对异常捕获后的补偿机制,如果发生异常这里也一定会被执行,因此可以在这里做一些补偿。
另外:
如果catch中不另外抛出异常,程序会正常往下进行不会停止
如果方法中的 try,catch里有返回,但是finally没有返回,那么会优先执行finally里的内容,再执行try,catch里的return。
如果方法的返回ry,catch里有返回,而且finally有返回,那么会优先执行finally里的内容,直接返回finally,不再执行try和catch的return。
如果方法的 try,catch里的返回是引用类型的,但是finally没有返回并且这里对引用类型进行赋值,那么执行try,catch里的return的时候不会修改到引用类型,但是对引用类型进行了属性设置就会对其造成修改,这是因为java里面只存在值传递,因此返回值在给finally时,如果是基础类型,那么就会复制一个基础类型的副本,那么finally是没办法对原有的进行修改的,而当返回值是引用类型的话,会复制一个返回值的地址副本给finally,所以当给引用类型的属性进行设置时,通过地址副本是可以找到堆内的对象,所以就能修改对象内的属性,而当直接将引用类型进行赋值修改的是地址,而这边接收到的只是一个地址副本而已,这个地址副本在方法运行完成后就会被销毁因此也不会改变原有的对象地址。