异常处理:
异常:
在代码运行过程中,因为用户的误操作,代码的BUG,或者等等一系列原因,引起的程序崩溃(程序无法向下继续执行)的现象,我们称之为异常。(不是代码编译错误!)
例如:数学异常除数为0,异常·报错ArithmeticException(数学异常)
异常处理:
本质就是提升程序的容错能力,保持程序的稳定性。
对异常预估和预判,解决异常现象,让·程序继续运行下去,不要崩溃和异常退出。
异常处理方案:
-
抓捕异常【重点学习】
- 针对可能出现异常的代码进行抓捕
-
Try{
-
- 针对可能出现异常的代码进行抓捕
//可能出现异常的代码
}catch( 异常对象 【Exception e】){
//如果出现一次,代码就会立刻进入catch中
//通过e.printStackTrace()可以打印出方法的调用栈,
//通过e.getmassage()可以打印出自己扔出的信息。
//在这里解决抓捕的异常
}
Finally{
//必须执行的代码(不管有没有异常) }
如果使用抓捕异常,通过这种处理方式,程序即便是遇到了,也不会崩溃!!!
如果出现多次异常,可以分别处理,也可以直接用大的异常处理类(Exception)直接全部处理
public static void main(String[] args) {
try { process1();
process2();
process3();
}
catch (IOException e) { System.out.println("Bad input");
}
catch (NumberFormatException e) { System.out.println("Bad input");
}
catch (Exception e) { System.out.println("Unknown error"); }
}
注意:异常处理类越大,就应该越放在后面,防止前面子类毫无意义。
注意:try内代码出现异常,后续代码将不会在继续执行,会直接跳转到catch代码块内执行:异常处理代码,最后执行finally代码块内。
(b),抛出异常
一般为编译型异常,如果我们不想处理,可以直接抛给调用者,由调用者完成处理,如若调用者处理不了,以此往上推至JVM,若还是无法处理,程序就会直接挂掉。
Public static void 函数名(函数参数)throws 异常1,异常2,……{
//出现异常的内容
}
异常分类:
-
编译型异常
-
代码在编译过程中直接抛出异常,这种异常必须处理,不然代码无法正常运行。
-
-
运行时异常
-
在编译的过程中没有出现异常,但在运行过程中可能因各种原因(逻辑顺序,……)抛出异常,
-
Java中异常的继承关系:
Throwable(异常的顶级类):
-
Exception
-
RuntimeException(运行时异常)
-
剩下的都是编译型异常
-
-
Error(一般这个类的异常:表示一种致命的异常,无法拯救)
-
OutOfMemoryError:内存耗尽
-
NoClassDefFoundError:无法加载某个Class
-
StackOverflowError:栈溢出
-
finally关键字:
不管异常有没有,finally{ //代码 }里面的代码必须执行.
finally{ //代码 }里面的代码可以是:
回收垃圾,关闭IO流,关闭数据库连接,……核心必须要执行的代码
注意:在开发的过程中请注意,return 关键字和finally关键字同时出现的情况,认真分析仔细考虑。
注意finally有几个特点:
1. finally语句不是必须的,可写可不写;
2. finally总是最后执行。如果没有发生异常,就正常执行try { ... }语句块,然后执行finally。如果发生了异常,就中断执行try { ... }语句块,然后跳转执行匹配的catch语句块,最后执行finally。可见,finally是用来保证一些代码必须执行的。某些情况下,可以没有catch,只使用try ... finally结构
3.在catch中抛出异常,不会影响finally的执行。JVM会先执行finally,然后抛出异常。
自定义异常类:
目前接触到的都是java官方提供的异常处理类;
自己设计异常类
定义一个普通类,让该类成为Exception类或者成为它的子类的子类(建议使用,相对应的物品英文名称定义异常名称)
Public MyException extends runtimeException{
重写生成所有构造函数:ALT+SHIFT+S——>generate constructors from superclass……
}
在自定义异常时建议使用运行时异常(runtimeException),不建议使用编译型异常(Exception).
自定义异常可以向调用者传递信息!!!
异常抛出:
可以通过创建异常(系统或者自定义),来给调用者一个确切的错误信息,调用者就可以通过抛出的信息做出对应判断。
包装类:
基本数据类型对象包装类特点:
用于在基本数据和字符串之间进行转换。
基本数据类型 | 对应包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
bolean | Boolen |
float | Float |
double | Double |
char | Charcter |