java进阶4-异常
异常体系结构
当出现问题时告诉我们,并把详细消息告诉我们
异常分类
Object下有Throwable(可抛出的)
Throwable下有两个分支:Error(不可处理,直接退出JVM)和Exception(可处理的)
Exception下有两个分支:
Exception的直接子类:编译时异常(要求程序员在编写程序阶段必须预先对这些异常进行处理,如果不处理编译器报错,因此得名编译时异常。)。
RuntimeException:运行时异常。(在编写程序阶段程序员可以预先处理,也可以不管,都行。)
runtimeException
程序本身错误,包括逻辑,语法等
runtimeException 之外
程序外部错误,用try。。catch捕获处理
try{ }…catch(){…}…finaly{…}
try 内放有可能有异常的代码
catch 捕获异常
finaly 无论如何都要执行的代码
public class ExceptionTest10 {
public static void main(String[] args) {
FileInputStream fis = null; // 声明位置放到try外面。这样在finally中才能用。
try {
// 创建输入流对象
fis = new FileInputStream("nihao.txt");
// 开始读文件....
String s = null;
// 这里一定会出现空指针异常!
s.toString();
System.out.println("hello world!");
// 流使用完需要关闭,因为流是占用资源的。
// 即使以上程序出现异常,流也必须要关闭!
// 放在这里有可能流关不了。
//fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch(IOException e){
e.printStackTrace();
} catch(NullPointerException e) {
e.printStackTrace();
} finally {
System.out.println("hello 浩克!");
// 流的关闭放在这里比较保险。
// finally中的代码是一定会执行的。
// 即使try中出现了异常!
if (fis != null) { // 避免空指针异常!
try {
// close()方法有异常,采用捕捉的方式。
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println("hello kitty!");
}
}
程序中如果没有异常处理机制,程序在程序运行过程中,告知异常,并停止运行。
try中的代码出现异常,系统抛出异常,try中在出现异常的代码将不会执行,即使捕获到错误永远也不会执行;
catch捕获异常处理,catch中接收的是系统给我们的异常对象,没有适合的catch捕获到异常,程序将会停止运行。只要catch到了异常,处理不处理,程序都将往下执行。
取得异常信息
getMessage()
简单信息
printStackTrace()
异常堆栈信息
finaly和return
遇到return了,先执行finaly再执行return
throws 声明异常
方法后使用throws,声明异常,哪个方法调用这个声明了异常的方法,必须处理,否则依然用throws抛出。
public void doOther() throws Exception{
}
throw 自己抛出异常
在编程时遇到了自己不想要的情况,创建制造一个异常告知大家出现了问题,需要处理。
public void push(Object obj) throws MyStackOperationException {
if(index >= elements.length - 1){
// 改良之前
//System.out.println("压栈失败,栈已满!");
//return;
// 创建异常对象
//MyStackOperationException e = new MyStackOperationException("压栈失败,栈已满!");
// 手动将异常抛出去!
//throw e; //这里捕捉没有意义,自己new一个异常,自己捉,没有意义。栈已满这个信息你需要传递出去。
// 合并(手动抛出异常!)
throw new MyStackOperationException("压栈失败,栈已满!");
}
// 程序能够走到这里,说明栈没满
// 向栈中加1个元素,栈帧向上移动一个位置。
index++;
elements[index] = obj;
// 在声明一次:所有的System.out.println()方法执行时,如果输出引用的话,自动调用引用的toString()方法。
System.out.println("压栈" + obj + "元素成功,栈帧指向" + index);
}
异常捕获顺序 catch
从大到小
自定义异常
通常继承Exception或RuntimeException,看情况继承哪个
方法覆盖时如果要抛出异常
父类方法有抛出异常的情况,子类在重写时不能抛出比父类中被重写的方法更多的异常,但可以抛出子异常(继承了父异常类的子异常)