异常的使用

news/2024/6/17 22:00:34 标签: 开发语言, java, jvm

第一章  异常

1、异常概念

        异常,就是不正常的意思。在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响,在程序中的意思就是:

  • 异常:指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。

        在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。

        异常指的并不是语法错误,语法错了,不会产生字节码文件,根本不能运行。

2、异常体系 

        异常机制其实是帮助我们找到程序中的问题,异常的根类是java.lang. Throwable,其下有两个子类:java.lang.Error与java.lang.Exception,平常所说的异常指java.lang.Exception,Throwable类,是所有异常类的根类,所有的异常类都是由它继承。

Throwable体系:

  • Error:严重错误Error,无法通过处理的错误,只能事先避免,好比绝症。
  • Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须处理的。好比感冒、阑尾炎。

Throwable中的常用方法:

public void printStackTrace():打印异常的详细信息。包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。
public String getMessage():获取发生异常的原因。提示给用户的时候,就提示错误原因。
public String toString():获取异常的类型和异常描述信息(不用)。

3、异常分类

我们平常说的异常就是指Exception,因为这类异常一旦出现,我们就要对代码进行更正,修复程序。

异常(Exception)的分类:根据在编译时期还是运行时期去检查异常?

  • 编译时期异常:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)
  • 运行时期异常:runtime异常。在运行时期,检查异常,在编译时期,运行异常不会编译器检测(不报错)。(如数学异常)

4、异常的产生过程解析 

 

第二章 异常的处理

1、抛出异常throw

Java异常处理的5个服关键字:try、catch、finally、throw、throws

在编写程序时,我们必须要考虑程序出现问题的情况。比如,定义方法时,方法需要接受参数。那么,当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者。

java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。那么,抛出一个异常具体如何操作呢?

  1. 创建一个异常对象。封装一些提供信息(信息可以自己编写)。
  2. 需要将这个异常对象告知给调用者。怎么告知呢?怎么将这个异常对象传递到调用者处呢?通过关键字throw就可以完成。throw异常对象。throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。
throw new  异常类名(参数);

注意:

  1. throw关键字必须写在方法的内部
  2. throw关键字后边new的对象必须是Exception或者Exception的子类对象
  3. throw关键字抛出指定的异常对象,我们就必须处理这个异常对象。throw关键字后边创建的是RuntimeException或者RuntimeException的子类对象,我们可以不处理,默认交给JVM处理(打印异常对象,中断程序)。throw关键字后边创建的是编译异常(写代码的时候报错),我们就必须处理这个异常,要么throws,要么try...catch。

2、Objects非空判断

还记得我们学习过一个类Objects吗,曾经提到过它由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的),那么在它的源码中,对对象为null的值进行了抛出异常操作。

public static <T> T requireNonNull(T obj){

        if(obj==null)

                throw new NullPointException();

        return obj;

}

查看指定引用对象不是null
java">import java.util.Objects;

public class Test {
    public static void main(String[] args)  {
        method(null);
    }
    public static void method(Object object) {
        /*if (object == null) {
            throw new NullPointerException("转递的对象的值是null");
        }*/
        Objects.requireNonNull(object,"传递的对象的值是null");
    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar=6298:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\Exception Test
Exception in thread "main" java.lang.NullPointerException: 传递的对象的值是null
	at java.base/java.util.Objects.requireNonNull(Objects.java:233)
	at Test.method(Test.java:11)
	at Test.main(Test.java:5)

Process finished with exit code 1

3、声明异常throws

声明异常:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理,那么必须通过throws进行声明,让调用者去处理。关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常)。

修饰符   返回值类型    方法名(参数) throws  异常类名1,异常类名2...{        }

注意:

  1. throws关键字必须写在方法声明处
  2. throws关键字后边声明的异常必须是Exception或者是Exception的子类
  3. 方法内部如果抛出了多个异常对象,那么throws后边必须也声明多个异常,如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可
  4. 调用了一个声明抛出异常的方法,我们就必须的处理声明的异常,要么继续使用throws声明抛出,交给方法的调用者处理,最终交给JVM处理,要么try-catch自己处理异常
5、异常注意事项
  • 多个异常使用铺货又该如何处理呢?
  1. 多个异常分别处理。
  2. 多个异常一次捕获,多次处理。
  3. 多个异常一次捕获一次处理。              

一般我们是使用一次捕获多次处理方式、格式如下:

try{

       编写可能会出现异常的代码

}catch(异常类型A     e){

                        处理异常的代码

                        记录日志、打印异常信息、继续抛出异常

}catch(异常类型B      e){

                        处理异常的代码

                        记录日志、打印异常信息、继续抛出异常

}

注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。

  • 运行时异常被抛出可以不处理。即不捕获也不声明抛出。
  • 如果finally有return语句,永远返回finally中的结果,避免该情况
java">public class Test {
    public static void main(String[] args)  {
        int a = getA();
        System.out.println(a);
    }
    public static int getA() {
        int a = 10;
        try {
            return a;
        } catch (Exception e) {
            System.out.println(e);
        }finally {
            a = 100;
            return a;
        }
    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar=4074:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\Exception Test
100

Process finished with exit code 0
  • 如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。
  • 父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。只能捕获处理,不能声明抛出

总结:父类异常是什么样,子类异常就什么样
 


http://www.niftyadmin.cn/n/4927433.html

相关文章

8月10日,每日信息差

1、菜鸟国际快递“承诺达、晚必赔”覆盖22国。具体来讲&#xff0c;菜鸟国际快递对无忧、经济和简易三种标准产品全面升级&#xff0c;其中英国、意大利、加拿大、美国四国时效平均提升30%以上。凡使用这三种快递产品发货至22国的商家&#xff0c;其货物在速卖通电商平台享有“…

【Eureka技术指南】「SpringCloud」从源码层面让你认识Eureka工作流程和运作机制(下)

原理回顾 Eureka Server 提供服务注册服务&#xff0c;各个节点启动后&#xff0c;会在Eureka Server中进行注册&#xff0c;这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息&#xff0c;服务节点的信息可以在界面中直观的看到。Eureka Client 是一个Java 客…

TailWindCss 在Hbuilderx中使用

基于这个插件 weapp-tailwindcss 地址 本次说明基于HbuilderX 创建的项目非CLI 安装步骤按照文档走&#xff0c;先安装上几个依赖。然后是几个配置文件 tailwind-input.css tailwind的css文件用来引入到app.vue /* #ifdef H5 */ tailwind base; /* 如果是小程序的话&#x…

linux软件安装篇

文章目录 linux软件安装篇配置yum源访问nginx服务页面如何运行一个淘宝网在你的机器上修改nginx的首页 linux软件安装篇 linux是纯黑屏的 学习使用yum工具&#xff0c;安装应用程序 阿里云的yum仓库&#xff0c;https://developer.aliyun.com/mirror/ 阿里云非常丰富且强大…

Vue Baidu Map--点标记bm-marker的使用、注意事项

点标记 bm-marker的使用 import引入bmMarker 和bmLabel 组件 <script> import BaiduMap from vue-baidu-map/components/map/Map.vue import bmMarker from vue-baidu-map/components/overlays/Marker import bmLabel from ./components/vue-baidu-map/components/over…

【UE4 RTS】04-Camera Pan

前言 本篇实现了CameraPawn的旋转功能。 效果 步骤 1. 打开项目设置&#xff0c;添加两个操作映射 2. 打开玩家控制器“RTS_PlayerController_BP”&#xff0c;新建一个浮点型变量&#xff0c;命名为“PanSpeed” 在事件图表中添加如下节点 此时运行游戏可以发现当鼠标移动…

windows 安装免费3用户ccproxy ubuntu 代理上网

Windows 上进行安装 ubuntu 上进行设置 方法一 (临时的手段) 如果仅仅是暂时需要通过http代理使用apt-get&#xff0c;您可以使用这种方式。 在使用apt-get之前&#xff0c;在终端中输入以下命令&#xff08;根据您的实际情况替换yourproxyaddress和proxyport&#xff09;。 终…

210. 课程表 II Python

文章目录 一、题目描述示例 1示例 2示例 3 二、代码三、解题思路 一、题目描述 现在你总共有 numCourses 门课需要选&#xff0c;记为 0 到 numCourses - 1。给你一个数组 prerequisites &#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示在选修课程 ai 前 必须 …