- 异常
异常的类型
Exception 异常层次结构的根类
ArithmeticException 算数错误
ArrayIndexOutOfBoundsException 数组越界
NullPointerException 访问空值
ClassNotFoundException 没有加载所需的类
InputMismatchException 输入的数据类不匹配
IllegalArgumentException 方法接收到非法参数
异常定义
(1)不是编译错误;
(2)程序在运行时发生的不正常现象。
异常的坏处
(1)信息不友好;非专业的用户不容易理解。
(2)中断正在运行的程序。
常见的异常
(1) ArrayIndexOutOfBoundsException:数组越界异常。
(2) NullPointerException:空指针异常。
(3) ClassCastException:类型转换异常。
异常处理机制
try…catch的方式处理异常
try(检测异常)…catch(捕获异常)…finally(释放资源)
有三种搭配方式
try catch
try catch finally
try finally
执行过程:
- (1)依次从上往下匹配类型,执行匹配到的第一条;执行完毕跳出try…catch结构,执行后续语句。
- (2)多条catch语句时,子类放前面,父类放后面。
(3)finally:总会执行。通常程序收尾的语句。
(1)有没有异常都会执行。
(2)有异常,无论捕捉到与否都会执行。
throws和throw的区别
throws
用在方法声明后面,跟的是异常类名。可以跟多个异常类名,用逗号隔开,表示抛出异常,由该方法的调用者来处理。
throw
用在方法体内,跟的是异常对象名,只能抛出一个异常对象名,表示抛出异常,由方法体内的语句处理。
JVM默认是如何处理异常的
如果我们没有写针对的处理方式,就只有交给调用 main 的 jvm 来处理,jvm 有一个默认的异常处理机制,将该异常进行处理.并将该异常的名称,异常的信息.异常出现的位置打印在了控制台上,同时程序停止运行。
finally关键字的特点及作用
finally 的特点
被finally控制的语句体一定会执行
特殊情况:
在执行到finally之前jvm退出了(比如System.exit(0))
自定义异常
除了系统给定的异常,我们还可以自己定义异常可以通过名字区分到底是什么异常,有针对的解决办法
自定义异常需要继承异常的基类
(继承 Exception 或者 RuntimeException)
异常的注意事项及如何使用异常处理
异常注意事项
a:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。
b:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常
c:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws
如何使用异常处理
原则:
如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws
区别:
后续程序需要继续运行就try
后续程序不需要继续运行就throws
最后
如果JDK没有提供对应的异常,需要我们来自定义异常。