Java高级系列——异常(Exception)

2023-11-04

在解释Java中的异常时,首先我们来看一张图


这里写图片描述

上图是我们Java中,异常类的一个继承关系图,从图中我们可以看到Java标准库内构建的这些通用的异常,他们都是以Throwable为顶层父类。

Throwable又派生出Error类和Exception类。

错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。

异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。

总体上我们根据Javac对异常的处理要求,将异常类分为两类,一类是checked exception,一类是unckecked exception。

unckecked exception

Error 和 RuntimeException 以及他们的子类。javac在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。所以如果愿意,我们可以编写代码处理(使用try…catch…finally)这样的异常,也可以不处理。对于这些异常,我们应该修正代码,而不是去通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等。

我们来看一个具体实例

public class UncheckExceptionDemo {
    public static void main(String[] args) {
        A object = new A("Ron");
        object = null;
        System.out.println(object.getName());
    }

    public static class A{
        private String name;

        public A(String name){
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }
}

执行上面的的代码,系统就会抛出一个java.lang.NullPointerException异常,这属于unckecked异常,因为我们程序在编写,编译的过程中,javac都不会强制要求我们做任何处理,同时这种异常只有在程序的运行时过程中才会发现并抛出,所以NullPointerException属于运行时异常(RuntimeException )。

checked exception

除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应该为这样的异常时刻准备着。如SQLException , IOException,ClassNotFoundException 等。

我们来看一个具体实例

public class CheckedExceptionDemo {
    public static void main(String[] args) throws IOException {
        File file = new File("D://hello.txt");
        if(!file.exists()) {
            file.createNewFile();
        }
        PrintWriter writer = new PrintWriter(file);
        writer.write("您好");
        writer.close();
    }
}

看上面的代码,当我们在对文件进行处理时,比如我们声明File,并判断指定路径下文件是否存在,不存在则创建文件时,编译器就会要求我们在方法中,要么抛出IOException异常,要么使用try…catch…finally语句捕捉异常信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java高级系列——异常(Exception) 的相关文章

随机推荐

  • Mac OS下使用X11访问远程Unix 主机图形界面

    1 启动XQuartz2 打开偏好设置 勾选输入下的 模拟三按键鼠标 3 输出可以选择 全屏模式 按Command Option A切换4 如果修改了配置需要退出重新启动生效5 选择 应用程序 终端 6 终端窗口打开后输入 xhost 然后
  • TCP和UDP区别通俗理解

    TCP协议与UDP协议的区别 首先咱们弄清楚 TCP协议和UCP协议与TCP IP协议的联系 很多人犯糊涂了 一直都是说TCP IP协议与UDP协议的区别 我觉得这是没有从本质上弄清楚网络通信 TCP IP协议是一个协议簇 里面包括很多协议
  • 调整vscode工具栏字体大小

    之前的效果 文件 菜单 控制台字体都很小 修改过后 文件 gt 首选项 gt 设置 gt 窗口 gt Zoom level 只修改代码字体大小如下
  • DiskGenius无损windows系统迁移(增加硬盘)

    在DiskGenius主菜单 点击 工具 系统迁移 菜单项 根据引导选择源磁盘 目标磁盘 最后 注意最好选择重启到微pe迁移 这样不容易出错 迁移完成之后 电脑会自动重启 此时很可能会遇到一个问题 电脑黑屏 只有鼠标能动 只能强制关机 此问
  • stress-ng交叉编译在板子上运行

    一 直接用我移植好的 https github com fanchenxinok stress ng arm 二 自己移植过程 1 下载源码包 https kernel ubuntu com cking tarballs stress ng
  • Spring Bean的作用域

    Spring Bean的作用域 我们在Spring中定义一个Bean时 需要声明该Bean的作用域 默认值是singleton Spring框架支持的作用域有以下几种 1 singleton singleton 是默认的作用域 当将一个be
  • JPA、Hibernate和Mybatis的比较

    一 应用场合 传统公司 部分个人开发者喜欢用jpa 而互联网公司更青睐于mybatis 原因 1 mybatis更加灵活 开发迭代模式决定了他是互联网公司的首先 每一次的修改不会带来性能上的下降 2 传统公司需求迭代速度慢 项目改动小 hi
  • 五大常用算法之五:分支限界法

    分支限界法 我们已知 回溯法的思想是深度优先搜索加剪枝 与之相对 分支限界法的思想是广度优先搜索加剪枝 搜索过程使用剪枝函数来为了避免无效的搜索 剪枝函数包括两类 1 使用约束函数 剪去不满足约束条件的路径 2 使用限界函数 剪去不能得到最
  • Docker-Compose 内容介绍

    一 Docker Compose 简介 Docker Compose 项目是Docker官方的开源项目 负责实现对Docker容器集群的快速编排 Docker Compose 项目由 Python 编写 调用 Docker 服务提供的API
  • Dev c++中文乱码,codeblocks运行结果乱码解决办法

    Dev c 乱码 codeblocks也乱码 最近Dev c 打开C语言的文件中文乱码 用codeblocks打开代码没事但是运行结果乱码了 情况如下 因为只有2020 10 12之后的 Dec C 版本的编码支持 utf 8 旧版的 De
  • 电巢独家直播|第七届世界无人机大会圆满落幕!

    当前 全球化秩序正进入新的调整阶段 数字化技术与生产生活深度融合 将加速推动数字化经济的全面渗透 中国经济也正由高速增长向高质量发展转变 这为无人机行业创造了更多的战略机遇 根据深圳市无人机行业协会统计 2022年 全国1 2万多家无人机企
  • 腾讯云服务器+ContOS 7.6安装MySql(二)

    腾讯云服务器 ContOS 7 6安装MySql 二 安装 使用XShell的登录到我们的云服务器 网上说在CentOS中默认安装有MariaDB 先来查查看有没有 root VM 4 7 centos yum search mysql L
  • 开源CmBacktrace移植到RT-Thread Nano

    一 CmBacktrace特性 CmBacktrace 是一款针对 ARM Cortex M 系列 MCU 的错误代码自动追踪 定位 错误原因自动分析的开源库 支持的错误包括 断言 assert 故障 Hard Fault Memory M
  • 解决vmware 本地连接时出错:地址仍未与网络终结点关联

    场景 使用vmware创建了server2008的虚拟机 使用的桥接模式 桥接模式是选择的自己的wifi网卡 虚拟机启动后发现无法联网 ipconfig查看 下图 发现ip地址段就不对 应该是192 168 1 尝试释放ip或者获取新的ip
  • python实现斐波拉契数列函数

    简单介绍一下 斐波拉契数列 斐波那契数列 Fibonacci sequence 又称黄金分割数列 因数学家莱昂纳多 斐波那契 Leonardoda Fibonacci 以兔子繁殖为例子而引入 故又称为 兔子数列 指的是这样一个数列 0 1
  • 企业架构LNMP学习笔记10

    1 Nginx版本 在实际的业务场景中 需要使用软件新版本的功能 特性 就需要对原有软件进行升级或重装系统 Nginx的版本需要升级迭代 那么如何进行升级呢 线上服务器如何升级 我们选择稳定版本 从nginx的1 14版本升级到nginx的
  • Git的简介和使用

    本文来自数据学习网 https www datalearner com 专注于机器学习方法 数据挖掘技术和编程技术 原文地址 https www datalearner com blog 1051521123408432 Git是一个版本控
  • IOException异常的处理方式

    首先看一段代码 这段代码有明显的IO异常 一般我们的做法是捕获异常 public static void main String args try 文件可能不存在 FileWriter fw new FileWriter W demo tx
  • 第5章 团队开发管理-测验题-作业

    1 在软件开发的各种资源中 D 是最重要的资源 A开发工具 B方法 C硬件环境 D人员 2 在攻克技术难题时 最佳的开发团队组织模型是 A A民主式结构 B主程序员式结构 C矩阵式结构 D以上所有选项都不是 3 在选择开发团队组织结构时应考
  • Java高级系列——异常(Exception)

    在解释Java中的异常时 首先我们来看一张图 上图是我们Java中 异常类的一个继承关系图 从图中我们可以看到Java标准库内构建的这些通用的异常 他们都是以Throwable为顶层父类 Throwable又派生出Error类和Except