导言:在java中,总会出现各种各样的小bug,但是,有的是机器本身导致的,有的就是程序员编写代码不规范导致了,这一类被称作异常。今天我总结了异常的类型,出现的原因,解决方法,还有如何防止异常。
当然,本文章并不是为了让我们不出现异常,只是出现了异常要知道如何处理。
架构图:
- 异常:异常就是代表程序出现的问题
-
Exception:叫做异常,所有异常的父类
代表程序可能出现的问题,我们通常会用Exception以及他的子类来封装程序出现的问题。-
编译时异常:编译阶段就会 出现异常提醒的。(如:日期解析异常)
在编译阶段,必须手动处理,否则代码会报错- 在 java文件 经过 javac命令后 编译成 字节码文件(class文件) 时候,出现的异常;提醒 程序员 检查本地信息
编译阶段:Java不会运行代码,只会检查语法是否错误,或者做一些性能的优化
- 在 java文件 经过 javac命令后 编译成 字节码文件(class文件) 时候,出现的异常;提醒 程序员 检查本地信息
-
运行时异常::RuntimeException及其子类,编译阶段不会出现异常提醒;运行时出现的异常(如:数组索引越界异常)
运行时异常(编译阶段不需要处理,代码运行时出现异常)- 在字节码文件(class文件) 经过 java命令 到运行结果 之间,运行时出现的异常;代码出错而导致程序出现的问题
-
-
运行时异常和编译时异常的区别?
- 编译时异常:除了RuntimeExcpetion和他的子类,其他都是编译时异常。编译阶段需要进行处理,作用在于 提醒程序员。
- 运行时异常:RuntimeException本身和所有子类,都是运行时异常编译阶段不报错,是程序运行时出现的。一般是由于 参数传递错误带来的问题
-
异常的作用
-
作用一:异常是用来查询bug的关键参考信息
-
作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况
-
-
异常的处理方式
-
JVM默认的处理方式
把异常信息以红色字体打印在控制台,并结束程序,下面的代码不在执行- 把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
- 程序停止执行,下面的代码不会再执行了
-
自己处理
捕获异常:try...catch 目的:当代码出现异常时,可以让程序继续往下执行。
细节:父类异常,写在最后,否则会接收所有的子类异常-
格式:
- try { 可能出现异常的代码; } catch ( 异常类名 变量名 ){ 异常的处理代码; }
-
过程:try里面出现异常,创建对应异常对象,跟catch里面的 异常名对比,找到对应的catch,执行对应的 处理代码。
-
注意:catch中的异常名也可以是其父类接收,当出现其父类异常时候,将父类尽量放最下方,否则会将所有的异常全部接收
-
灵魂四问:
- 灵魂一问:如果try中没有遇到问题,怎么执行?
- 会把try里面所有的代码全部执行完毕,不会执行catch里面的代码
注意: 只有当出现了异常才会执行catch里面的代码
- 会把try里面所有的代码全部执行完毕,不会执行catch里面的代码
- 灵魂二问:如果try中可能会遇到多个问题,怎么执行?
- 会写多个catch与之对应。但是如果遇见异常会直接去找对应的catch,并结束,不会再执行下一个异常
- 细节: 如果我们要捕获多个异常,这些异常中如果存在父子关系的话,那么父类一定要写在下面 否则父类会接收所有异常。后续catch无法使用
- 灵魂三问:如果try中遇到的问题没有被捕获,怎么执行?
- 相当于try...catch的代码白写了,最终还是会交给虚拟机进行处理。
- 灵魂四问:如果try中遇到了问题,那么try下面的其他代码还会执行吗?
- 下面的代码就不会执行了,直接跳转到对应的catch当中,执行catch里面的语句体但是如果没有对应catch与之匹配,那么还是会交给虚拟机进行处理
- 灵魂一问:如果try中没有遇到问题,怎么执行?
-
Throwable 的成员方法
- 常用:public void printStackTrace() 在底层是利用System.err.println进行输出
细节:仅仅是打印信息,不会停止程序运行 , 把异常的错误信息以 红色字体 输出在控制台
- 其他:
- public String getMessage() 返回此 throwable 的详细消息字符串 public String tostring() 返回此可抛出的简短描述
- 常用:public void printStackTrace() 在底层是利用System.err.println进行输出
-
-
抛出异常
throws :细节点:编译时异常:必须要写。 运行时异常:可以不写。 throw:写在方法内部,手动抛出异常,交给调用者处- throws:代表可能会有这个异常,如果出了这个异常,你没有做处理, 会自动交给JVM处理——打印到控制台中,并结束程序 细节点:(编译时异常:必须要写。 运行时异常:可以不写。)
编译时异常:必须要写。 运行时异常:可以不写。
- throw:写在方法内部,手动抛出异常,交给调用者处,下面方法不需要执行在方法中,出现异常了。方法就没有继续运行下去的意义了,采取抛出处理,让该方法结束运行并告诉调用者出现了问题,
交给调用者:返回到方法的调用处
- throws:代表可能会有这个异常,如果出了这个异常,你没有做处理, 会自动交给JVM处理——打印到控制台中,并结束程序 细节点:(编译时异常:必须要写。 运行时异常:可以不写。)
-
RuntimeException() :运行时异常,只要是运行过程中出现异常,都可以用这个声明、抛出或捕获
父类异常,写在最后,否则会接收所有的子类异常
-
-
自定义异常:为了让控制台的报错信息更加的见名之意
-
自定义异常过程:
- 1.定义异常类
- 2.写继承关系
- 3.空参构造(继承父类)
- 4.带参构造(继承父类)
-
命名技巧:
- NameFormat:当前异常的名字,表示姓名格式化问题
- Exception:表示当前类是一个异常类
-
要继承的父类:
- 运行时异常 :RuntimeException 核心 就表示由于参数错误而导致的问题
- 编译时异常 :Exception 核心 提醒程序员检査本地信息
-