【java学习之路】(java SE篇)006.异常

本文深入讲解Java中的异常处理机制,包括异常的概念、分类、常见类型及处理方式等,并介绍了如何通过自定义异常来满足特定需求。

异常

异常的概念

异常:
在程序运行过程中出现的不正常的情况

注意:
1.相同的代码在运行的时候,根据输入参数或者操作的不同,有可能会发生异常,有可能不会
————应该在写代码的过程中尽可能保证代码的正确性
2.如果要解决代码中的异常,需要添加非常复杂的代码逻辑来进行判断,会使代码变得非常臃肿,不利于维护
————推荐使用异常机制来处理程序中的异常问题
3.程序在执行过程中如果出现了问题会导致后面的代码无法执行
而使用异常机制之后,对异常情况进行处理,同时后续的代码会继续执行,不会中断整个程序
4.在异常处理的过程中,不要只是简单的输出错误,要尽可能地将异常的详细信息进行输出
e.printStackTrace():打印异常的堆栈信息【可以从异常信息的最后一行进行追踪,寻找自己所编写的java类】
System.out.println(e.getMessage()); 输出异常的错误信息(用的很少)

异常处理方式

1.捕获异常

try(代码逻辑)catch(Exception e){异常处理逻辑}
try(代码逻辑)catch(具体的异常Exception e){}(具体的异常Exception e){}catch…
好处:可以针对每一种具体的异常做更丰富的处理
注意:当使用多长catch的时候,一定要注意相关异常的顺序,将子类放在最前面的catch,父类放在后面的catch
执行过程中可能出现的情况:
1.正常执行,只执行try中的代码
2.遇到异常情况,会处理try中异常之前的代码的逻辑,后面的逻辑不会执行,最后会执行catch中的代码
3.使用多重catch的时候会遇到异常子类不匹配的情况,此时依然会报错,因此建议在catch最后将所有异常的父类写上

public class TestException {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        try{
            System.out.println("请输入被除数:");
            int num1 = in.nextInt();
            System.out.println("请输入除数:");
            int num2 = in.nextInt();
            System.out.println(String.format("%d / %d = %d", num1,num2,num1/num2));
//        }catch (Exception e){
//            System.out.println("出现异常");
//            e.printStackTrace();
            //java.lang.ArithmeticException: / by zero
            // at TestException.main(TestException.java:32)

//            System.out.println("-------------");
//            System.out.println(e.getMessage());  // /by zero
        }
        catch(ArithmeticException e){
            System.out.println("数学异常,除数不能是0");
            e.printStackTrace();
        }catch (InputMismatchException e){
            System.out.println("输入的参数值类型不匹配");
            e.printStackTrace();
        }catch (NullPointerException e){//异常类型不匹配
            System.out.println("空指针异常");
            e.printStackTrace();
        }catch (Exception e){//建议在catch最后将所有异常的父类写上
            System.out.println("出现异常");
        }
        System.out.println("感谢使用本程序");

    }
}

关于finally

public class FinallyDemo {
/*
    在程序运行过程中,如果处理异常的部分包含finally处理,那么无论代码是否会出现异常,finally代码块总会执行
        finally中包含哪些处理逻辑
            1.IO流的关闭操作一般设置在finally中
            2.数据库的连接关闭操作设置在finally中
 */
    public static void main(String[] args) {
        try{
            System.out.println(1/0);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("我是finally处理块");
        }
    }
}

2.声明异常、抛出异常、用户自定义异常

/*
    用户自定义异常:
        在java的API中提供了非常丰富的异常类,但是在某些情况下不太满足我们的需求,此时需要自定义异常
        步骤:
            1.继承Exception类
            2.自定义实现构造方法
            3.需要使用的时候,使用throw new自定义异常名称;
        什么时候需要使用自定义异常:
            一般情况下不需要,但是在要求明确或是要求异常格式统一的时候是必须要自己实现的
 */
public class GenderException extends Exception{

    public GenderException(){
        System.out.println("性别异常");
    }

    public GenderException(String message){
        System.out.println("message");
    }
}
/*
    声明异常throws:
        在异常情况出现的时候,可以使用try...catch...finally的方式对异常进行处理,除此之外,可以将异常向外抛出,由外部进行处理

        1.在方法调用过程中,可能存在多个方法之间的调用,假如每个方法中都包含了异常情况,那么就需要在每个方法中进行try...catch...
            另外一种比较简单的方式,就是在方法最外层调用一次调用处理一次即可
            即使用throws的方法,对所有执行过程中所有方法出现的异常进行统一集中处理
        2.如何判断使用throws还是try...catch
            最稳妥的方式实在每个方法中都进行异常的处理
            偷懒的方式是判断在整个调用过程中,外层的调用是否有对异常的处理,如果有,直接使用throws

    抛出异常throw
    	使用throw new 异常名称;(通常配合声明异常使用)

 */
public class Exception2 {
    public static void main(String[] args) {
        try{
            show();
        }catch (GenderException e){
            e.printStackTrace();
        }
        System.out.println("hh");

    }

    public static void show() throws GenderException{
        String gender = "1234";
        if(gender.equals("man")){
            System.out.println("man");
        }else if(gender.equals("woman")) {
            System.out.println("woman");
        }else {
//            throw new Exception("性别出现错误");
            throw new GenderException();
        }
    }
}

常见的异常类型

1.Exception:异常层次结构的父类
2.ArithmeticException:算术错误情形,如以0作为除数
3.ArrayIndexOutOfBoundsException:数组下标越界
4.NullPointerException:尝试访问null对象成员
5.ClassNotFoundException:不能加载所需的类
6.IllegalArgumentException:方法接收到非法参数
7.ClassCastException:对象强制类型转换出错
8.NumberFormatException:数字格式转换异常,如把“abc”转换成数字

异常的分类

在这里插入图片描述

Throwable的两个子类:Exception和Error

Exception又分为Checked异常和运行时异常

​ Checked异常必须捕获或者声明抛出

​ 运行时异常不要求

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值