异常的详解

1.什么是异常 

异常就是程序运行过程中发生的预料之外的错误,可以是程序逻辑上的错误,也可以是外部原因如文件已经存在的情况下创建文件。

2.异常的体系结构

所有异常的超类是Throwable,它下面的子类有Error(错误类)和Exception(异常类),万物皆可抛。

Exception下面常用的子类有IOException、RuntimeException、ClassNotFoundException

Error为错误,程序无法处理,如OutOfMemoryError、ThreadDeath等,只能交给jvm来处理,大多jvm最终会选择终止线程。

Exception是异常, 程序可以处理的异常,它又分为两种CheckedException(受捡异常),一种是UncheckedException(不受检异常),受检异常发生在编译期,如果不用try catch捕获,会报错;不受检异常,发生在运行期,具有不确定性,一般是程序中的逻辑错误导致,如除0异常,在编译期间无法检查到只能在运行时发现

3.异常的处理

Java具有代码级的强制性异常检测机制,即许多常见的可预料的异常可能都必须编写代码处理,否则就无法编译通过。

1.try catch

try{
    //可能出现异常的代码
   
}catch(Exception e1){//如果发生的异常和catch里面的异常不同(且不是子父类关系)则catch也不执行,且catch后面的也不执行,finally还是会执行
    
    //打印相关错误信息
    e1.printStackTrace();
    //错误的处理
}
catch(Exception e1){//如果发生的异常和catch里面的异常不同(且不是子父类关系)则catch也不执行,且catch后面的也不执行,finally还是会执行
    
    //打印相关错误信息
    e2.printStackTrace();
    //错误的处理
}

2.try catch finally

try{
    //可能出现异常的代码
    //如果在此处发生异常下面的代码不会执行会直接跳转到catch语句
}catch(Exception e1){//如果发生的异常和catch里面的异常不同(且不是子父类关系)则catch也不执行,且catch后面的也不执行,finally还是会执行
    
    //打印相关错误信息
    e1.printStackTrace();
    //错误的处理
}catch(Exception e2){//如果发生的异常和catch里面的异常不同(且不是子父类关系)则catch也不执行,且catch后面的也不执行,finally还是会执行
    
    //打印相关错误信息
    e2.printStackTrace();
    //错误的处理
}
finally{
    //无论是否出现异常都会执行的代码,且就算捕获的异常和catch里面的不同,也会执行
    //注意如果方法需要返回值,捕获异常之后,在这里return值
}

注意:

1.try语句里面的变量作用域只在最近大括号内

2.方法返回值,如果在try中写,那么catch里面也要写

3.不是所有的异常都需要try catch,异常分为CheckedException(受检异常)、UncheckedException(不受检异常),

其中只有受检异常需要强制被捕获,不捕获会报错,而不受检异常只有程序运行才能发现不需要强制捕获,即不捕获也不会报错。

4.不论是否发生异常finally中的代码都会执行

5.先捕获的异常范围应当小于等于后捕获的异常

6.try 后面跟一个或多个catch(或一个finally)

7.当异常发生时会终止当前流程去执行catch语句

8.jdk1.7以前catch语句中只能有一个异常类,jdk1.7之后能有多个异常类并用 | 分割开

try{
​
}catch(IOException e | ClassnotfoundException e){
  e.printStackTrace();
}

3.throw

我们在程序中遇到我们无法处理或不想在当前位置处理的异常使用throw抛出到上层调用者方法处。

(要结合throws使用,我们每抛出一个异常就要用throws在方法处声明抛出的异常类型)

public static void main(String[] args) throws IOException {
        throw new IOException("haha");
 }

4.throws

当我们用throw 用来声明方法抛出的异常类型

(要结合throw使用,我们每抛出一个异常就要用throws在方法处声明抛出的异常类型)

public static void main(String[] args) throws IOException,MyException{
        throw new IOException("haha");
 }

4.异常的信息分析

当程序出现异常时,我们使用异常的printStackTrace()方法来打印错误的信息

try{
    //可能出现异常的代码
   
}catch(Exception e1){//如果发生的异常和catch里面的异常不同(且不是子父类关系)则catch也不执行,且catch后面的也不执行,finally还是会执行
    
    //打印相关错误信息
    e1.printStackTrace();
    //错误的处理
}
catch(Exception e1){//如果发生的异常和catch里面的异常不同(且不是子父类关系)则catch也不执行,且catch后面的也不执行,finally还是会执行
    
    //打印相关错误信息
    e2.printStackTrace();
    //错误的处理
}

5.自定义异常

1.创建自定义异常

创建自己的异常类继承自Exception及其子类

包装一下父类的构造方法(1个或多个)

public class MyException extends Exception{
    public MyException() {
    }
​
    public MyException(String message) {
        super(message);
    }
​
    public MyException(String message, Throwable cause) {
        super(message, cause);
    }
​
    public MyException(Throwable cause) {
        super(cause);
    }
​
    public MyException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

2.使用自定义异常

public class Test {
    public static void main(String[] args) throws  MyException {
        Scanner sc = new Scanner(System.in);
        throw new MyException("哈哈");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值