异常就是java程序在编译和运行过程中出现的错误
异常的根父类:Throwable
Error:程序员不能处理的错误。例如电脑坏了、数据库崩溃、服务器宕机
Exception:程序员能够处理的异常。
编译时异常:执行javac编译时出现的异常,必须马上处理。
运行时异常:执行java运行时候出现的异常,出错了,查看错误信息,回头修改代码。
1、jvm默认是如何处理异常的。
答:main函数收到这个问题时,有两种处理方式
a. 自己将该问题处理,然后继续运行。
b. 自己没有针对的处理方式,只有交给调用main的jvm来处理
jvm有一个默认的异常处理机制,就将该异常进行处理,并将该异常的名称、异常的信息,异常出现的位置打印在控制台上,同时将程序停止运行。
2、自己处理:try...catch...finally
try:可能出错的代码
catch:一旦出错,处理的代码,捕获异常(捕获错误)
finally:一般用于关闭资源。
(多个catch同时出现的时候,最大的异常必须放在最后一个)
一般被finally控制的语句体一定会执行。作用:用于释放资源,在IO流操作和数据库操作中会见到。
3、交给别人处理: throws:抛出异常
javaee开发:底层开发,一般抛出异常。
安卓开发:自己处理,把错误隐藏。
4、throws和throw的区别:
a. throws
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示声明异常,由3该方法的调用者来处理
b. throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
5、自定义异常
运行异常都是RuntimeException的子类
ArithmeticException:除0异常
ClassCastException:类型转换异常
NullPointerException:空指针异常
ConcurrentModificationException:并发修改异常
IndexOutOfBountsException:越界异常
ArrayIndexOutOfBoundsException
StringIndexOutOfBountsExceptions
除RuntimeException都是编译异常,如ParseException解析异常、IOException
自定义异常:1、继承Exception 2、继承RuntimeException
6、面试题:final、finally、finalize的区别
final 作为修饰符
修饰变量,变量会变为常量,一旦赋值,不能被修改
修饰方法,方法不能被重写
修饰类,类不能被继承
finalize 作为方法
当垃圾回收器运行的时候,会自动调用该方法
finally 作为语句(try...catch...finally语句中的一部分)
一般放在finally中的语句一定会执行,所以一般用于关闭资源
7、面试题:如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return之前还是在return之后?
答:会执行,会在return之前。