【Java】异常类处理

一、问题

在java代码开发过程中,我们会有一个异常代码处理机制;
1.内存溢出之类的,非代码影响的,代码维度内我们处理不了,不在讨论范围内;
2.运行时异常,代码不会自动检测异常;这是我们处理的重点;
3.非运行时异常,代码工具会自动检测,不处理不让运行;

那么怎么处理这些异常类呢?

二、详解

1.e.printStackTrace();

只是打印栈路径,不影响try-catch之外的代码的执行;

public class TestException {
    public static void main(String[] args) {
        System.out.println("开始");
        String name = "tom cat";
        name = null;
        name = toUpperCase(name);
        System.out.println(name);
        System.out.println("结束");
    }

    private static String toUpperCase(String name){
        try{
            name = "【"+name.toUpperCase()+"】";
        }catch (Exception e){
            e.printStackTrace();
            //throw new Exception("查询用户列表报错");
        }
        return name;
    }
}

运行结果如下:
在这里插入图片描述

2.try-catch-throw异常

try用于监控异常区域,catch用于处理异常情况,throw是用于抛出异常,将底层的异常抛到上层,最后由上层统一处理;单个抛出的异常类需要继承java.lang.Exception;
在这里插入图片描述

我们将toUpperCase这个方法直接抛出异常,即throws Exception,这样,try监控的错误一旦被发现,就会被抓取,并且打印栈路径,注意,这里是把栈错误的路径打出来,而不是报错(虽然他是红色的);
接下来,我们发现,main方法总的该方法下面也有红色波浪线,它说该方法没有处理异常类,这是运行时异常,要去我们必须处理完之后才能运行;所以,接下来,我们要对该方法可能会抛出的异常类做处理;一般有两个方法:
1、直接抛出,直接抛出的结果是,try-catch后面的代码将不会执行,如果你的业务需求是,只要出错了,就不让它继续执行,你可以采取这种方法;这就好比,一旦停电,电灯就灭了;
2、采用try-catch抓取,然后人为处理(不抛出异常);这种方式处理的好处是,try监控的区域出现错误,你可以运行catch里面的代码,并且继续执行catch外面的代码;这种方式的好处是,如果出错,我会自己处理,并让他继续执行后面的代码;这就好比,虽然停电了,但是我有备用电源,一旦感应器感应到停掉,就接入备用电源,这样点灯可以继续亮着;

在这里插入图片描述

另外,引用该方法的类,也需要处理这个异常,因为该方法将异常抛了出去,谁引用了该方法,谁就要接这个异常,并处理;

现在,我们处理后的代码如下:

public class TestException {

    /**
     * 1.main 方法
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("开始");
        String name = "tom cat";
        name = null;
        try {
            name = toUpperCase(name);
        } catch (Exception e) {
//            e.printStackTrace();
            System.out.println("运行toUpperCase方法报错啦~");
        }
        //System.out.println(name);
        System.out.println("结束");
    }

    /**
     *  2.底层方法
     * @param name
     * @return
     * @throws Exception
     */
    private static String toUpperCase(String name) throws Exception {
        try{
            name = "【"+name.toUpperCase()+"】";
        }catch (Exception e){
            //e.printStackTrace();
            throw new Exception("查询用户列表报错");
        }
        return name;
    }
}

运行后的结果如下:
在这里插入图片描述

三、总结

一般报错,可以分为两种报错模式,一种是逻辑性错误,例如空指针,数据格式错误等;另一种是业务性错误,执行到具体某个节点时报错;
你如果要将异常情况给业务人员看,那就一定要将系统报错的异常,转换成业务异常,抛出给他们看,他们看不懂什么NullPointerException,你要告诉他,到底是执行到某个业务节点错误,还是具体某个参数【输入参数为空】这类信息等;程序员追踪报错信息,可以根据logger日志,或者e.printStackTrace()来追踪;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陶洲川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值