没有按照原定的计划进行,发生了特殊状况,异常机制提供了程序退出的安全通道,当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器.
上图简单的展示了一下异常的结构图,但不是所有的异常,具体的可以查看api文档,还可以自定义异常
Throwable:是Java中所有错误或异常的超类,有两个重要的子类:Error(错误)和Exception(异常)
Error(错误):表示Java中的错误,一般是运行环境(jar包,依赖)等出了问题,是程序无法处理的错误,大多数与代码编写者的执行操作无关.
Exception(异常):是Throwable的一种形式,它指出了合理的应用程序想要捕获的条件,是程序本身可以处理的异常.
Exception分为两大类:运行时异常和非运行时异常(编译异常)
1.运行时异常:RuntimeException类及其子类异常,这些异常时不检查异常,程序可以选择捕获,也可以选择不处理,一般是由程序逻辑错误引起的,常见的运行时异常有:
NullPointerException:当应用程序试图在需要对象的地方使用 null 时,抛出该异常
IndexOutOfBoundsException:下标越界异常,指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出
ClassNotFoundException:类找不到异常
2.非运行时异常(编译异常):是RuntimeException以外的异常,类型都是Exception类及其子类,对于非运行时异常,Java编辑器强制要求,我们必须对这些异常进行处理,否则程序不能编译通过,常见的有:
IOException:io异常
SQLException:MySQL数据库引起的异常
以上异常知识简单的举例了几个,仅供参考,具体情况,请在代码中具体分析
throw new 异常信息:(手动制造一个异常)
当需要指定运行异常时,可以在发生异常的时候,使用throw new RuntimeException(msg)
注:msg自定义的异常信息
学到就要用到,来上实例:
public class ThrowException {
public static void main(String[] args) {
Scanner key = new Scanner(System.in);
System.out.println("请输入年龄");
int age = key.nextInt();
if(age<=0){
throw new RuntimeException("你还没出生,赶紧回去别捉妖");
}
System.out.println(age);
key.close();
}
}
使用throws关键字抛出异常:
在方法或类的后面加上throws XXXException(代表对应发生的异常)
throws:抛出得意思,表示将异常抛给上级(调用者)处理
如果是加在main方法得后面,表示交给Java虚拟机去处理异常
public class IODemo01 {
public static void main(String[] args) throws IOException {
File file = new File("D:\\我很帅.txt");
file.createNewFile();
}
}
现在报错提示我们有异常,要么抛出,要么捕获,我们这里选择throws抛出,也就是对应的第一个选项Add throws declaration
表示:当try中的语句发生异常时,会先到第一个catch中来查找是否发生了第一个异常,如果不是第一个就继续往下找,看是否是异常2,当处理完之后直接结束try…catch语句
格式1为:
try{
被捕捉的代码
}catch(异常类型 e){
对异常的处理
}
格式2为:
try{
语句1;
语句2;
}catch(异常类型1 e){
对异常的处理1
}catch(异常类型2 e){
对异常的处理2
}catch(异常类型3 e){
对异常的处理3
}
注意:当一个异常同时可以被多个catch捕获时,会采用就近原则,会选择与这个异常最相近的catch去执行
当多个catch语句中的异常时父子关系时,应将子异常写在前面。父异常写在后面
即:范围小的异常写在前面,范围大的异常写在后面
这里还拿刚才的例子来简单的说明:
public class IODemo01 {
public static void main(String[] args){
File file = new File("D:\\我很帅.txt");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
现在咱们选择第二个Surround with try/catch
**finally:**无论异常是否发生都会执行的代码块(根据需要,不是必须)
来看格式:
try{
语句1;
语句2;
}catch(Exception e){
对异常的处理
}finally{
最后一定会执行的代码;
比如我们使用完某个资源为了防止浪费,最后一定要关闭,操作中途可能有异常导致程序中断,但
是并不影响资源的关闭
}
来看代码,咱们故意写一个异常来看效果:
public class ExceptionDemo06 {
public static void main(String[] args) {
try {
System.out.println("打开连接池");
//在数学里面0不可以做为被除数的,所以这里会报异常:java.lang.ArithmeticException
int a = 2/0;
System.out.println("pilipal");
System.out.println("劈里啪啦工作中");
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("关闭连接池");
}
好了,本期异常就说到这里了,如果对异常或者其他有不懂的地方,欢迎前来加我微信进行探讨