异常
java中有三种错误
- 语法错误/编译错误: 在ide(集成开发环境)工具(eclipse等)中写代码,代码写错了,在工具中用红波浪线或者红叉来表示,如果显示红波浪线,此代码不能通过工具进行编译,不能编译就不能执行
- 逻辑错误:
前提是语法没有错误,程序可以编译,能运行,但结果错误
一般原因就是代码的逻辑写错了,最终的结果也是错的 - 运行错误/异常/例外:
前提是逻辑没有错误,但在运行期间因为某种原因导致错误,程序意外终止,这种错误就叫异常.
一定要注意,异常是在运行期间发生的
比如: int num1,num2;从键盘录入 int result = num1/num2;
如果num2录入的是非零值,程序可以正常运行,没有异常,如果num2录入的是0,程序不能正常运行,代码逻辑正确,有异常但程序异常终止
有了异常,最直接的结果就是程序终止了,这不是程序的目的,所以要处理异常,处理异常的目的有两个
- 避免程序意外终止
- 如果出现了异常,程序不能终止,还要给一个提示
程序意外终止:程序执行到某一行位置不执行了,jvm就不在执行这个程序
处理的方案:
- 用java代码提供的异常处理机制 try catch finally
- 用java的逻辑代码来处理,即用java代码来容错
try catch的注意事项
一般情况,try块中监视的代码需要程序员猜测产生异常的可能性,在try块中的代码可能有n中异常
那么就在try块的下面写n个catch,且catch抓取的异常类型是不同的,如果发生了异常,但是没有catch来抓住,程序还是意外终止的,为了解决这个问题,需要添加第n+1个catch,这个catch的异常类型是Exception异常类型,即catch(Exception e),且此catch必须放在所有catch的最后
一个try可以有零个或一个或多个catch
一个try可以没有catch,但必须有finally
finally
finally块中放置若干java代码,一般情况下,finally块中的代码是用来释放try块中申请的内存空间
try块中如果有异常,会抛出异常,在某一个catch块接收到系统抛出的异常(必须保证catch抓取的异常类型跟抛出的异常类型相同),然后对应catch块中的代码就被执行了,catch块一般有类代码,一个是栈的轨迹,另一个是友好的交互或提示的代码
执行完当前catch块中的代码后,会跳过后面所有的catch块,执行finally块中的代码,执行完finally块后的代码后,继续执行finally块后面的代码,即没有异常,最终都会执行finally块.用于销毁申请的内存空间.
异常的继承层次
顶级类: Throwable
Throwable类有两个子类
- Error类: 不是程序员能使用的,一般情况下是给jvm使用的 比如: 往u盘中写入一个文件,但没有u盘设备,异常要报给jvm处理
- Exception类:是程序员能够写代码处理异常的根类
分为两类
- 免检异常:不是必须添加try catch finally的,程序是能够编译和执行的,执行时触发的符合的异常还是意外终止
- RuntimeException 运行时异常
- ArithmethicException 算数异常
- NullPointerException 空指针异常
- ArrayIndexOfBoundsException 数组下表越界异常
- NumberFormatException 数字格式异常
- InputMismatchException 输入不匹配异常 …
- 必检异常:必须添加try catch finally,如果不添加,会有红波浪线提示,程序不能编译和执行
- Exception 所有程序员能处理的异常的根类
- SQLException sql异常
- ClassNotFoundException 类没有发现异常
- FileNotFound 文件没有发现异常 …
判断
如果程序员在写代码时,代码没有错,但报红波浪线并提示”Unhandled exception type XXXException”
只要提示这句话,那么就属于必检异常,必检异常必须添加try catch
快捷键 alt+shift+z 来调出代码块的模板
throw
在java中,有一个Exception类,这个类有很多子类,且每个子类都对应一种异常类型,这些异常类型都是java类库自带的异常类型
NullIndexException , ArrayIndexOfBoundsException 类似这些异常都是java定义好的规则,触犯规则就抛出异常
java不可能把所有项目中遇到的异常都事先写好异常类,由程序员根据实际业务需求来抛出异常
比如:
年龄在1到100岁之间,如果不在范围内,就抛出相应的异常
程序员定规则,程序员用java代码检测,程序员抛出
实现的方式有两种
1. 用try catch finally
2. 用java逻辑代码来处理
throws
throws关键字放在方法声明后面,可以写很多异常类型,之间用逗号间隔,表明此方法体可能会抛出的异常,这些异常不在当前方法体中用try-catch-finally来处理,谁调用此方法,谁就用try-catch-finally来处理
注意:Exception类型必须放在所有的异常类型后面
throws的应用场景
一般情况下,写类库的时候,类库是提供给其他项目使用的,类中的方法如果有异常,就适合用throws抛出,然后谁调用方法,谁就用try catch来处理
自定义异常
程序员自己创建的java类,但是必须继承自Exception及其子类中的任何类都可以,那么此类就是自定义异常类
自定义异常类是作为本项目的异常类型的补充
应用场景
java不可能把所有项目中出现的异常,都事先准备好,所以程序员根据需求自定义异常类,在自定义的异常类中,提供异常错误信息