在编写JAVA代码的时候,如果你漏了一个分号,或者写错名称啥的,在你点击运行之前就会有红线提示你这个错了这个是编译器给你找的错。但有的时候编译器找不出错误,比如 int a=1/0; 这句话不会报错然后在你运行的时候会输出一串红字。这个在运行的时候给你报的错就是异常
如果程序出现了异常,在未做捕获的情况下会中止程序的运行.
程序在运行过程中JVM运行异常而导致的系统运行中断,这种情况就是异常了
public static void main(String[] args) {
int i = 1/0;
System.out.println("HELLO");
}
运行以上代码,并没有输出HELLO,因为第一句int i = 1/0;已经出错给中止掉了。
到这,异常的严重性就能有一个认识。如果你写的代码在运行的时候突然因为某个异常给中止了。那就很严重了。
异常的分类。
这种中断的原因大致分为两大类,Error和Exception
Error是错误,一般是指程序遇到了非代码直接造成严重的错误。比如内存溢出。
Exception是异常,一般是写了不合理的代码导致运行到一半被终止了。
Exception分为运行时异常和检查性异常.
运行时异常RuntimeException是你在点击运行了之后才会出现的异常。比如上面的1/0;这个编译器检查不出,但是在运行的时候能检查出来并报错中止程序。
检查性异常比如IOException这个是在你写完这一行代码后就会有红线提示你出错的异常。这类异常在编译期就能发现,你需要捕获或者抛出才能编译通过。
错误继承于Error,异常继承Exception, 异常和错误都继承于Throwable
异常的捕获处理
异常是我们不允许的,因为大多数情况它会中止掉程序,这是很严重的。但是异常是可以避免的。
上面说到异常有两类,检查性异常和运行时异常。
检查性异常在编译期就能被发现。所以这类异常直接就能避免。
运行时异常只有在运行的时候才能被发现。所以这类的异常就需要在编写时要注意预测才可能避免.对于那些一定能够避免的,比如上面的1/0,我们不写这样的代码就行。而对于一些可能避免不了的。我们就需要捕获异常来进行异常处理来避免程序被中止。
那么异常如何捕获?try…catch语句
还是用1/0举例,如果说有个计算器让用户输入,用户不小心输入了1/0.我们虽然没有直接在代码写1/0,但是用户注入了这么一段代码导致出错。这种情况我们肯定保证系统不崩溃并要给用户一个反馈,比如提示除数不能输0.怎么做?
public static void main(String[] args) {
try {
fun(1,0);
}catch (ArithmeticException a){
System.out.println("除数不能为0");
}
}
public static void fun(int num1,int num2){
int i = num1/num2;
}
使用try{}catch(){}语句
try{
//你要运行的程序
}catch(异常){
//出现异常后你要运行的程序
}
格式就是这样
从最上面的图可知,1/0出了一个这样的异常ArithmeticException 所以catch语句里面就写这个异常。
这段代码的意思就是先试着运行 fun(1,0);如果出异常了,看看异常是不是ArithmeticException如果是就执行 System.out.println(“除数不能为0”);
所以上面代码的运行结果是
除数不能为0
但如果有时候它有可能会出多个异常呢?
public static void main(String[] args) {
try {
fun(1,0,8);
}catch (ArithmeticException a){
System.out.println("除数不能为0");
}catch (ArrayIndexOutOfBoundsException a){
System.out.println("你指定的索引太多了");
}
}
public static void fun(int num1,int num2,int index){
int[] iArray = {1,2,3};
int i1 = iArray[index];
int i = num1/num2;
}
这段代码就有可能出现两个异常,一个是索引不正确的异常,还有一个不能为0的异常这样就多写一个catch来捕获。
但有时候你并不知道会出什么异常,但就是有可能会出.如何写?
public static void main(String[] args) {
try {
fun(1,0,8);
}catch (Exception e){
System.out.println("反正就是出错了");
}
}
就这么写。不过这样不太好定位确切的错误。
异常的捕获就这么做,使用try.catch语句。
那么一般是什么需要使用try.catch.
–>当你不能保证这段代码不会出错的时候。就用try.catch来防止程序被中止。并在这种情况中在catch语句做一些挽回或者提示并记录错误的操作。
异常的一些方法
从上面的catch语句发现,
catch (ArithmeticException a),这个a有什么方法呢?
这里就例常用的
1,a.printStackTrace();//打印出异常堆栈信息
使用这个方法的动机:出错了,但是捕获了异常所以程序没被中止,但我想知道异常信息.用这个方法
2,a.getMessage();//获取出现异常的具体描述
String message = a.getMessage();
System.out.println(message);
结果就输出这个。
当然还有别的方法就不说了。用的比较多的就是printStackTrace()这个方法。即便捕获了也是要看看异常信息的
finally代码块
try…catch完整的代码块是
try{
//要执行的程序
}catch(异常){
//出异常后要执行的程序
}finally{
//不管有没有出异常都要执行的程序
}
–>其中try一定要有.catch和finally至少要有一个。
finally代码块的意思就是在try…catch执行完后最终一定会执行的语句
public static void main(String[] args) {
try {
int i = 0/1;
}catch (ArithmeticException a){
System.out.println("除数不能为0");
}finally{
System.out.println("不管有没有出异常都要执行");
}
}
结果输出:
不管有没有出异常都要执行
如果改成1/0,就会输出
除数不能为0
不管有没有出异常都要执行
到这finally的作用就说完了。
那么使用finally的动机是什么?
一般用在那些有开关按钮或者执行完后要初始化的程序,这边就模拟一下。
public static void main(String[] args) {
try {
System.out.println("打开开关执行程序");
System.out.println("关闭,防止浪费资源");
}catch (Exception e){
System.out.println("出错了.");
}finally{
System.out.println("关闭,防止浪费资源");
}
}
这么一段模拟开关场景的代码。假如没有finally语句那么一旦出错,它就无法关闭资源了。
但是添加了finally就不用担心这个问题。
–>当然你也可以在catch语句添加一句关闭开关的代码.但这样岂不是多此一举了?
把try语句的 System.out.println(“关闭,防止浪费资源”);删除.统一移到finally中就能体现出finally的意义.
具体情况具体分析,总之在你使用了try语句的时候一定要稍微思考下,是否需要添加finally{}
异常如何避免?
1,一些你无法保证不会出错的代码。比如上面的计算器,你不能保证用户不会给除数输
0这种由客户使用方操作造成的情况使用try…catch来捕获并在catch进行一些异常处理
2.不写一定会出异常的代码.比如你直接在代码里写1/0.
3.使用条件语句来避免异常
public static void main(String[] args) {
fun(3);
}
public static void fun(int index){
int[] numArray = {1,2,3};
if(index>2||index<0){
System.out.println("数组下标越界了");
}else {
System.out.println(numArray[index]);
}
}
用条件语句来避免异常–>这个方法是最常用的避免异常的方法。
Error错误
Error是严重错误,它会直接中断程序而且无法捕获。但是大部分的Error是可以避免的。
1.比如类找不到.就是突然某一天你把某个类删了。但是引用这个类的代码没删。这时候你运行就会出Error但这个很容易解决。把代码删了就好
2,内存溢出。内存溢出多半是你写的代码耗费资源太多。考虑下优化就能有效避免
总之如果出了Error就思考下方案。总会有解决的办法。
总结:
1,异常是什么?
一个程序运行到一半因为程序或者系统原因导致中断。这个就是异常。
2.异常有哪些?
运行时异常和检查性异常
3.异常如何捕获?
try…catch
4.finally代码块怎么用?
try…catch…finally.表示不管出没出异常都要执行的代码
5.异常如何避免
(1)无法保证不会出异常的代码块用try…catch
(2)不写一定会出异常的代码
(3)使用条件语句来避免异常