异常
概述
程序在进行过程中发生的错误,叫做异常
作用:增强程序的健壮性
异常在java中以类的形式存在,每一个异常类都能创建对象
所有的错误(error)和异常(exception)都是可以抛出的
所有的错误(error)只要执行,JVM退出(不能处理)
概述二
编译时异常和运行时异常都是发生在运行阶段,在编译阶段异常是不会发生
所有异常都是在执行时发生的:
因为异常只有在执行时才能new对象
异常的发生就是new异常对象
编译时异常为什么而得名?
因为编译时异常必须在编译阶段预先处理,如果不处理,报错
运行时异常又称 非受控异常 未受检异常 (UnCheckedException)
编译时异常又称 受检异常 受控异常 (CheckedExeption)
对异常的处理
java中有两种方式处理异常
- 在方法声明的位置上使用throws 关键字 (抛给上一级)
- 在java中如果一直上抛最后会抛给JVM 最后终止程序的执行
- 一般不建议在main方法上使用throws关键字,建议使用 try..catch
- 使用try..catch 进行异常的捕捉
语法:
try{
// try 尝试 java代码
}
catch(异常 变量名){
//捕捉异常后的分支
}
编译时异常必须处理 要么上抛 要么捕捉
注意:
- 只要异常没有捕捉,采用上报的方式,此方法的后续代码不会执行
- 另外需注意,try语句块中某一行出现异常,该行后面的代码不会执行catch 捕捉到后,后续代码执行
自定义异常
所有异常都有共同的特点
有参构造
无参构造
自定义异常的编写
提供两个构造方法
- 无参
- 有参(string s)
class MyException extends Exception {
public MyException(){
}
public MyException(String s){
super (s);
}
}
抛异常
throw 关键字
throw new MyException(“这是一个自定义异常”);
深入 try catch
catch 后面的小括号可以是具体的异常类型,也可以是该异常类型的父类型
catch可以写多个,建议catch一个一个精准处理
catch写多个的时候,从上到下必须是从小到大
什么时候选择捕捉/上报
- 如果希望调用者来处理异常,使用上报
- 其他情况使用捕捉
异常对象的两个重要方法
获取异常简单的描述信息 这个信息就是构造器里的String参数
Exception exception = new Exception("你的程序报错")
String s = exception.getMessage();
System.out.println(s); 这里会输出 你的 程序报错
打印异常追踪的堆栈信息
exception.printStackTrace();
java.lang.Exception: asdfat While03.main(While03.java:6)
异常信息如何看
从上往下,一行一行(sun公司写的代码不用看)
finally
和try..catch 一起使用
- 在finally子句中的代码时最后执行的,并且一定会执行
- 即使try出了异常,也会执行
try和fianlly可以联合使用(没有catch)
try{
System.out.println("aaa");
return;
} finally{
System.out.println("bbb");
}
//输出结果 aaa bbb
但是如果try中有System.exit(0); //退出jvm
finally不执行 只有这一条代码能治他