算数异常
数组下标越界异常
空指针异常
如何理解异常
其实异常就是一个又一个类 所以这些类是有一个继承关系的
异常的处理
异常的抛出(throw关键字)
可以借助throw关键字手动抛出异常
同样是抛出异常 之前提到的算数异常是编译器抛出的 而上面这个是由程序员手动借助代码抛出的
一般借助throw抛出的异常 以自定义异常为主
异常声明throws
可以继续通过throws 使编译通过将异常交给JVM处理
解析:
当程序确实抛出了异常才会被catch捕获 并运行其后面的代码块 如果
如果改为
关于try catch()详解
对于这样一个代码 由于越界会导致异常 并且下面那句也不会执行
此时我们可以通过try catch()来使下面一句可以执行
如果仍然希望打印错误信息 则可以调用printStackTrace()方法
注意是先打印了after 后面才打印错误信息
也可以一个try写多个catch()
但注意不会同时抛出多个异常 比如这个try中其实两个异常都出现了 但是由于先catch到了数组越界异常 后面的空指针异常的catch就不会执行了
也可以这样写 但不建议
程序终止
finally
finally中的代码块不管是不是发生了异常 都会被执行
那么要finally 干什么呢?
finally一般用于资源的释放
举例
发现当我们传参没有出现异常时 try catch 结构之后的语句没有被执行
当我们输入不是10 是abc时
传参错误时 try catch 结构之后的语句才被执行
但有些资源必须被关闭 所以 需要finally
也可以写在try的括号里 这样finally里就不用写关闭的了
关于finally是最后执行
结果为
因为 finally是一个善后工作 是在最后实施的 也就是说即使try中已经return了但仍然要运行finally中的代码块
总结一下 try catch 结构
也就时说 try中会直接运行
- 有异常并且被成功捕获 则会运行完catch中的代码块之后把结构后面的代码块也给执行了
- 有异常但是没有成功捕获 就会报错误信息 结构后面的代码块不会被执行
- 有finally时 try中代码有return
- 没有异常时 由于try中含有return 则直接return 不会运行结构后面的代码块 但会运行f代码块
- 有异常并且成功捕获时 则会将结构中和结构后面的全部执行了(因为try中出现异常肯定在return一句之前 所以try没有return 所以结构后面的代码会被执行)
throw和throws的区分
自定义异常类
先看一下编译器自带的异常是怎么写的
照葫芦画瓢写一个用户名异常
借助throw抛出
但是 如果继承于Exception 则会报错
错误在这里:
原因是两个父类代表不同的异常
受查异常在编译时就会报错
受查异常在编译时 必须处理之后才能编译通过 可以借助try catch结构解决