异常概述
什么是异常?异常是程序在“编译”或者“执行”的过程中可能出现的问题,注意:语法错误不算在异常体系中,因为出现语法错误时虚拟机会提示你错误的地方。而真正的异常包括比如:数组索引越界、空指针异常、日期格式化异常等。
我们为什么要学习异常?在java里面程序出现了异常是会崩掉的,程序会推出然后虚拟机终止运行,研究异常并且避免异常,然后提前处理异常,体现的是程序的安全,健壮性。
异常体系
异常分为两大类,一类是Error,另一大类是Exception,由于Error代表的是系统错误我们暂不研究,我们要研究的是Exception代表的程序异常。
RuntimeException及其子类:运行时异常:编译阶段不会报错。(空指针异常,数组索引越界异常)
除RuntimeException之外所有的异常︰编译时异常,编译期必须处理的,否则程序不能通过编译。(日期格式化异常)。
运行时异常类型
- 数组索引越界异常:ArraylndexOutOfBoundsException
- 空指针异常:NullPointerException,直接输出没有问题,但是调用空指针的变量的功能就会报错。
- 数学操作异常:ArithmeticException
- 类型转换异常:ClasscastException
- 数字转换异常: NumberFormatException
运行时异常一般是程序员的自身问题~
编译时异常类型
- 除运行时异常之外的
处理机制:出现异常直接抛出去给调用者,调用者也继续抛出去。出现异常自己捕获处理,不麻烦别人。前两者结合,出现异常直接抛出去给调用者,调用者捕获处理。
异常的处理机制
编译时异常
方法一:throws
在用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理。这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。
方法二:try...catch
监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。发生异常的方法自己独立完成异常的处理,程序可以继续往下执行。
语法格式:
try{
// 监视可能出现问题的代码
}catch (Exception1 e) {
// 处理异常
}catch (Exception2 e) {
// 处理异常
}
1.怎么理解可能出现异常的代码呢?肯定不是把所有代码都放进去。例如我们有一个判断输入年龄的模块,要求用户输入,但时我们年龄类型设定的是int类型,而且年龄是有合理范围的,如果用户输入小数或者字符,那么此时程序就会出现异常,故应当把输入程序放到try监视里比较合适。
2.catch的括号里面异常类型是什么呢?我们如何选择?里面的异常类就是上文说到的:文件查找异常FileNotFoundException,数组越界异常ArrayIndexOutOfBoundsException等,就是告诉catch要找哪些错误,但通常情况下我们不会只写一种或者两种,而是直接把Exception e写道括号里,即代表所有的错误类型,企业级写法^.^
3.处理异常部分的作用?就是出现错误后运行里面的代码。有两种选择,你可以自定义方法,比如某变量不符合要求产生此类异常,你可以给它重新赋值,你也可以输出一句话:“数据异常!”等等。例外一种规范的方法是直接打印异常栈信息:语法-- catch(Exception e){ e.printStackTrace(); }