【java】JAVA异常机制总结

一、Java异常简介
异常定义:Java在编译或运行或者运行过程中出现的错误。

异常处理机制:让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰

Java异常机制用到的几个关键字:try、catch、finally、throw、throws

try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
catch – 用于捕获异常。catch用来捕获try语句块中发生的异常。
finally – finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
throw – 用于抛出异常。
throws – 用在方法签名中,用于声明该方法可能抛出的异常。主方法上也可以使用throws抛出。如果在主方法上使用了throws抛出,就表示在主方法里面可以不用强制性进行异常处理,如果出现了异常,就交给JVM进行默认处理,则此时会导致程序中断执行。

产生异常的原因:

用户输入了非法数据。
要打开的文件不存在。
网络通信时连接中断,或者JVM内存溢出。

二、异常的分类

异常的根接口Throwable,其下有2个子接口,Error和Exception。

Error:指的是JVM错误,这时的程序并没有执行,无法处理;
Exception:指的是程序运行中产生的异常,用户可以使用处理格式处理。

在这里插入图片描述

     1.Error(错误):一般是指java虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断,通常应用程序无法处理这些错误,因此应用程序不应该捕获Error对象,也无须在其throws子句中声明该方法抛出任何Error或其子类。

     2.Exception:Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件

     (1). SQLException:该异常提供关于数据库访问错误或其他错误的信息。

     (2). RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类

     (3).IOException:此类为异常的通用类,它是由失败的或中断的 I/O 操作生成的。

异常对象包含的常用方法:

  1. getMessage();返回该异常的详细描述字符

  2. printStackTrace():将该异常的跟踪栈信息输出到标准错误输出。

  3. printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定的输出流

  4. getStackTrace():返回该异常的跟踪栈信息。

Java 内置异常类
Java 语言定义了一些异常类在 java.lang 标准包中。

标准运行时异常类的子类是最常见的异常类。由于 java.lang 包是默认加载到所有的 Java 程序的,所以大部分从运行时异常类继承而来的异常都可以直接使用。

Java 根据各个类库也定义了一些其他的异常,下面的表中列出了 Java 的非检查性异常。

Java 根据各个类库也定义了一些其他的异常,下面的表中列出了 Java 的RuntimeException

在这里插入图片描述

下面的表中列出了 Java 定义在 java.lang 包中的检查性异常类(编译时候报错)
在这里插入图片描述

三、异常的使用及执行流程
1、异常的处理方案
try…catch、try…catch…finally、try…finally
try{
可能会发生的异常
}catch(异常类型 异常名(变量)){
针对异常进行处理的代码
}catch(异常类型 异常名(变量)){
针对异常进行处理的代码
}…
[finally{
释放资源代码;
}]

2、异常的执行流程
在这里插入图片描述

Error与Exception的区别:

Error(错误)是系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。

Exception(异常)表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

在catch捕获异常时,为什么不考虑使用Throwable类型,而只是使用Exception来进行接收?

Throwable表示的范围要比Exception大。实际上程序使用Throwable来进行处理,没有任何语法问题,但是却会存在逻辑问题。因为此时出现的(或者说用户能够处理的)只有Exception类型,而如果使用Throwable接收,还会表示可以处理Error的错误,而用户是处理不了Error错误的,所以在开发中用户可以处理的异常都要求以Exception类为主。

异常是一起处理好还是分开处理好?
根据实际的开发要求是否严格来决定。在实际的项目开发项目工作中,所有的异常是统一使用Exception处理还是分开处理,完全根据开发者的项目开发标准来决定。如果项目开发环境严谨,基本上要求针对每一种异常分别进行处理,并且要详细记录下异常产生的时间以及产生的位置,这样可以方便程序维护人员进行代码的维护。再次注意:处理多个异常时,捕获范围小的异常要放在捕获范围大的异常之前处理

throw和throws的区别?
throw和throws都是在异常处理中使用的关键字,区别如下:
throw:指的是在方法中人为抛出一个异常对象(这个异常对象可能是自己实例化或者抛出已存在的);
throws:在方法的声明上使用,表示此方法在调用时必须处理异常。

检查型异常(Checked Exception)与非检查型异常(Unchecked Exception)区别?

所有的检查性异常都继承自java.lang.Exception;所有的非检查性异常都继承自java.lang.RuntimeEx ception。
检查性异常和非检查性异常最主要的区别在于其处理异常的方式:
检查性异常必须使用try catch或者throws等关键字进行处理,否则编译器会报错;
非检查性异常一般是程序代码写的不够严谨而导致的问题,可以通过修改代码来规避。
常见的运行时非检查性异常:空指针异常(NullPointerException)、除零异常(ArithmeticException)、数组越界异常(ArrayIndexOutOfBoundsException)等;
常见的检查性异常:输入输出异常(IOException)、文件不存在异常(FileNotFoundException)、SQL语句异常(SQLException)等。

详细看文章:
https://blog.csdn.net/WOW_OMG/article/details/95181097?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1

四、实际运用
1、
public String encrypt(DataFlag dataFlag, String plainData) throws UnsupportedDataTypeException, TAException {
if(StringUtils.isEmpty(plainData)) {
return plainData;
}

    Integer[] idxAndType = DataFlagMap.keyIndexAndFlagMap.get(dataFlag);
    if(null == idxAndType) {
        throw new UnsupportedDataTypeException(String.format("数据类型[%s]不受支持", dataFlag == null? "null": dataFlag.name()));
    }

    try {
        return DataFlagMap.map.get(dataFlag) + encryptUtil.getInstance().dataEncrypt(idxAndType[0], idxAndType[1], plainData);
    } catch (Exception e) {
        log.error("调用加密机进行加密失败", e);
        throw new TAException(String.format("加密失败:%s", e.getMessage()));
    }
}
String encrypt(DataFlag dataFlag, String plainData) throws UnsupportedDataTypeException, TAException;
   public Result<EncryptAndDecryptResp> getEncryptAndDecryptInfo(@RequestBody @ApiParam(value = "加解密信息请求参数", required = true) @Valid EncryptAndDecryptReq req) {
        try {
            String data;
            if(OptType.ENCRYPT == req.getOperType()) {
                data = encryptService.encrypt(req.getDataFlag(), req.getValue());
            } else {
                data = encryptService.decrypt(req.getDataFlag(), req.getValue());
            }

            return new Result<EncryptAndDecryptResp>(new EncryptAndDecryptResp(data));

        } catch (UnsupportedDataTypeException e) {
            return new Result<EncryptAndDecryptResp>().setMessage(e.getMessage()).setCode("-3");

        } catch (TAException e) {
            return new Result<EncryptAndDecryptResp>().setMessage(e.getMessage()).setCode("-2");

        } catch(Exception e) {
            return new Result<EncryptAndDecryptResp>().setMessage(e.getMessage()).setCode("-1");
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java异常机制是一种用于处理程序执行期间可能出现的错误情况的机制Java中的异常分为两类:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。其中,受检异常必须在代码中进行捕获和处理,否则编译器将会报错。而非受检异常则不需要在代码中进行捕获和处理,但是如果不进行处理,会导致程序的异常终止。 Java中的异常机制通过抛出异常对象来表示程序中出现的异常情况,通常情况下,异常对象包含了异常的类型、异常的消息以及异常发生的位置等信息。当程序执行过程中出现异常情况时,就会抛出相应的异常对象,这个异常对象会被传递给调用栈上的上层方法,直到被捕获或者到达程序的顶层方法。 Java中的异常机制主要由三个关键字来实现:try、catch和finally。try块中包含可能抛出异常的代码,catch块用于捕获并处理异常,finally块则用于执行一些必须要完成的代码,无论是否抛出异常都会执行。 下面是一个简单的Java异常处理的例子: ``` public class ExceptionDemo { public static void main(String[] args) { try { int num = Integer.parseInt(args[0]); System.out.println("10 / " + num + " = " + (10 / num)); } catch (ArithmeticException e) { System.out.println("除数不能为0"); } catch (NumberFormatException e) { System.out.println("请输入数字"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("请至少输入一个参数"); } finally { System.out.println("程序执行完毕"); } } } ``` 在这个例子中,我们使用了try-catch-finally关键字来处理用户输入的参数,当输入参数不满足条件时,就会抛出相应的异常。catch块用于捕获并处理异常,finally块则用于执行一些必须要完成的代码,无论是否抛出异常都会执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值