java异常
在程序运行过程中出现的错误,称为异常。
java中异常都是以类的形式存在的。
一、异常的分类
1.1异常的层次结构
1.2异常的层次结构
异常主要分为:错误、一般性异常(受控异常)、运行期异常(非受控异常)
错误:如果应用程序出现了 Error,那么将无法恢复,只能重新启动应 用程序,最典型的Error 的异常是:OutOfMemoryError.
受控异常:出现了这种异常必须显示的处理,不显示处理 java 程序将无法编译通过
非受控异常:此种异常可以不用显示的处理,例如被 0 除异常,java 没有要求我们一定要处理
1.3 try、catch 和 finally
异常的捕获和处理需要采用 try 和 catch 来处理
try {
}catch(OneException e) {
}catch(TwoException e) {
}finally {
}
try 中包含了可能产生异常的代码
try 后面是 catch,catch 可以有一个或多个,catch 中是需要捕获的异常
当 try 中的代码出现异常时,出现异常下面的代码不会执行,马上会跳转到相应的catch 语句块中,如果没有异常不会跳转到 catch 中
finally 表示,不管是出现异常,还是没有出现异常,finally 里的代码都执行,
finally 和 catch可以分开使用,但 finally 必须和 try 一块使用,如下格式使用 finally 也是正确的
try{
}final{
}
1.4 try catch的深入
1)catch后面的小括号中的类型可以是具体的异常类型,也可以是异常类型的父类型
2)catch可以写多个,建议catch的时候,精确一个一个处理,这样有利于程序的调试
3)catch写多个的时候,从上到下,必须遵守从小到大.
4) catch里面可以使用 | 或隔开,在jdk8之前不允许.
二、编译时异常和运行时异常
1)编译时异常和运行时异常,都是发送在运行阶段。编译阶段异常是不会发生的。
2)因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错,因此得名.
3)所有异常都是发生在运行阶段,因为只有程序运行阶段才可以new对象,异常就是new异常对象.
2.1编译时异常和运行时异常d的区别
编译时异常一般发生的概念较高
运行时异常一般发生的概念较低
2.2特殊的称呼
编译时异常还可以叫做受检异常,还有叫做受控异常
受检异常:CheckException
受控异常
运行阶段异常可以叫做未受检异常,或者非受控异常
未受检异常:UnCheckedException
非受控异常
三、异常的处理方式
第一种:在方法声明的位置上,使用throws关键字
第二种:使用try,catch语句对异常进行捕捉
在方法声明的位置上使用throws关键字,谁调用方法,就抛给谁处理
public class Main {
public static void main(String[] args) {
try {
sj();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void sj() throws ClassNotFoundException{
int i = 12/ 0;
System.out.println(i);
}
}
四、异常信息的获取
取得异常信息的方法有两种
1)取得异常信息 getMessage()
打印简单的描述信息
try {
int e = 12/0;
}catch (Exception e){
System.out.println(e.getMessage());
}
NullPointerException e = new NullPointerException("空指针异常");
String s = e.getMessage();
System.out.println(s); // 空指针异常
- 取得异常的堆栈信息(比较适合于程序调试阶段):printStackTrace()
打印异常追踪的堆栈信息
打印异常堆栈信息采用了异步线程的方式.
try {
int e = 12/0;
}catch (Exception e){
e.printStackTrace();
}
//java.lang.ArithmeticException: / by zero
//at com.company.Main.main(Main.java:7)
五、上报和捕捉的选择
1)一般不建议在main方法上使用throws,因为这个异常如果真正的发生了,一定会抛给jvm,jvm只有将其终止,所以一般在main方法里面就直接try catch
开发中异常是上报还是捕捉的选择 --> 如果希望调用者来处理就上报
六、finally子句
finally子句代码的最后执行,并且是一定会执行的,即使try语句块的代码出现了异常.
七、final, finally, finalize的区别
final:关键字,表示最终的,不变的。
finally:也是关键字,和try联合使用。
finalize:finalize()是object类中的一个方法。作为方法名出现
使用finlize 是标识符,是jvm的垃圾回收机制调用
八、自定义异常
java自定义异常
两步:
1)编写一个类继承Exception或者RunTimeException.
继承Exception表示的编译时异常,需要在编译阶段进行处理,处理的 方法就是try-catch和throw 异常对象.
2) 提供两个构造方法,一个无参数的,一个带有String参数的.
class yc extends Exception{
public yc() {
}
public yc(String message) {
super(message);
}
}
public class Main {
public static void main(String[] args) {
// 创建异常对象,没有手动抛出
yc yc = new yc("用户名不能够为空...");
//打印异常堆栈信息
yc.printStackTrace();
//获取异常的简单描述信息
String str = yc.getMessage();
System.out.println(str);
}
}
自定义异常的常规用法
public class Main {
public static void main(String[] args) throws yc{
// 创建对象然后抛出去
throw new yc("酷酷酷");
}
}
九、异常与方法覆盖
重写之后的方法不能够比重写之前的方法抛出的异常更加多(更加宽泛),
可以更加少.
class cat{
public void dosome(){
}
}
class c extends cat{
public void dosome() throws Exception{ // 报错
// 如果是RuntimeException运行时异常可以继承,不会报错
}
}
十、总结异常中的关键字
try
catch
finally
throws 在方法声明的位置使用,表示上报异常信息给调用者
throw 手动抛出异常!
lic void dosome(){
}
}
class c extends cat{
public void dosome() throws Exception{ // 报错
// 如果是RuntimeException运行时异常可以继承,不会报错
}
}
十、总结异常中的关键字
try
catch
finally
throws 在方法声明的位置使用,表示上报异常信息给调用者
throw 手动抛出异常!