Java基础:Java异常机制

异常是程序运行过程中出现的错误。Java 把异常当作对象来处理,把异常信息封装成了一个类,并定义一个基类java.lang.Throwable作为所有异常的超类。Throwable : 它是所有错误与异常的超类(祖宗类),有两个子类 ErrorException

本篇主要记录内容包括:异常介绍、抛出异常、声明异常、捕获异常


  • 上一篇内容:Java基础:Java抽象接口
  • 下一篇内容:Java集合:概述
  • 更多知识学习:全网最全的 Java 技术栈内容梳理(持续更新中)

文章目录

    • 一、异常介绍
        • 1、异常继承体系
        • 2、运行时期异常&编译时异常
        • 3、发生异常到时候,程序的执行特征
        • 4、异常与错误的区别
        • 5、异常在方法重写中细节
    • 二、抛出异常、声明异常
        • 1、抛出异常 throw
        • 2、声明异常 throws
        • 3、自定义异常
        • 4、Throwable类中的常用方法
    • 三、捕获异常
        • 1、try…catch…finally
        • 2、异常处理流程
        • 3、try…catch…finally 异常处理的组合方式


一、异常介绍

1、异常继承体系

异常是程序运行过程中出现的错误。Java 把异常当作对象来处理,把异常信息封装成了一个类,并定义一个基类java.lang.Throwable作为所有异常的超类

  • Throwable : 它是所有错误与异常的超类(祖宗类),有两个子类ErrorException
  • Error : 错误,程序无法处理的错误,比如OutOfMemoryErrorThreadDeath等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
  • Exception : 异常,程序本身可以处理的异常,程序中应当尽可能去处理这些异常。
    • RuntimeException : 运行期异常,JAVA程序运行过程中出现的问题,可以通过java虚拟机来自行处理
    • CheckableException : 编译时异常或者可检查异常,我们应该捕获或者抛出,try…catch。

2、运行时期异常&编译时异常

  • 运行时期异常:方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常,运行时期异常一旦发生,需要程序人员修改源代码;
  • 编译时异常: 必须在编译前处理,否则无法通过编译

3、发生异常到时候,程序的执行特征

  1. 我们的代码,从发生异常的地方,开始被一分为二
  2. 在异常发生之前的代码,都可以正常运行,之后的代码不会执行
  3. 当异常发生的时候,这个异常被jvm所捕获,并将这个异常的所有相关信息,创建为一个异常对象,然后将该异常对象的信息输出到控制台(执行的是虚拟机默认的异常处理代码)
  4. 终止当前程序

4、异常与错误的区别

  • 异常:指程序在编译、运行期间发生了某种异常(XxxException),我们可以对异常进行具体的处理。若不处理异常,程序将会结束运行。
  • 错误:指程序在运行期间发生了某种错误(XxxErrorError错误通常没有具体的处理方式,程序将会结束运行。Error错误的发生往往都是系统级别的问题,都是jvm所在系统发生并反馈给jvm的。我们无法针对处理,只能修正代码。

5、异常在方法重写中细节

  • 子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明;
  • 当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集

二、抛出异常、声明异常

1、抛出异常 throw

在 java 中,提供了一个throw关键字,它用来抛出一个指定的(Throwable类型)异常对象,一般会用于程序出现某种逻辑时,程序员主动抛出某种特定类型的异常

使用格式:throw new 异常类名(参数);

具体步骤:

  • 创建一个异常对象, 封装一些提示信息(信息可以自己编写).
  • 通过关键字throw,将这个异常对象告知给调用者.
  • throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行

注意事项:

  • 如果抛出的异常对象属于可检查的异常,必须在该方法头部,声明抛出此异常, 即: throws 要抛出的异常类型;
  • 其次,对于抛出可检查的异常,还必须与方法的异常列表中的异常兼容;
  • 如果父类方法声明了异常列表:子类可以不声明异常列表,子类方法有自己异常列表时,必须保证,子类的异常列表所包含的异常类型,与父类中所包含的异常类型兼容

2、声明异常 throws

将问题标识出来,报告给调用者

throws是方法可能抛出异常的声明, 如果定义功能时有问题发生需要报告给调用者。可以通过在方法上使用throws 关键字进行声明。

对于声明了会抛出可检查异常的方法, 就意味着这个方法会产生可检查异常,所以,一旦调用该方法就必须对该方法做异常处理

throws后面可以写多个异常类,用逗号隔开

声明异常格式:修饰符 返回值类型 方法名(参数) throws <异常列表> { }

3、自定义异常

如果Java没有提供你需要的异常,则可以自定义异常类

编译时异常继承Exception,运行时异常继承RuntimeException

格式:

Class 异常名 extends Exception{ //或继承RuntimeExceptionpublic 异常名(){}public 异常名(String s){super(s);}
}

4、Throwable类中的常用方法

  • getCause():返回抛出异常的原因,即异常提示信息。如果 cause 不存在或未知,则返回 null;
  • getMessage():返回异常的消息信息,即该异常的名称与详细信息字符串;
  • printStackTrace():在控制台输出该异常的名称与详细信息字符串、异常出现的代码位置

三、捕获异常

1、try…catch…finally

Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理

捕获异常格式:

try {//需要被检测的语句。
}
catch(异常类 e) { //try中抛出的是什么异常,在括号中就定义什么异常类型。//异常的处理语句。
}
finally {//一定会被执行的语句。
}
//try:该代码块中编写可能产生异常的代码。
//catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理。
//finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。

2、异常处理流程

  1. 首先,当异常在try*代码块中发生的时候,虚拟机首先捕获这个异常,创建一个异常对象(包含本次异常的所有详细信息);
  2. 虚拟机会把这个异常,抛出给catch代码块(类似于方法调用,虚拟机会调用catch代码块中,处理异常的代码);
  3. 执行catch代码块,中的处理异常的代码;
  4. 没有终止我们应用程序,而是从catch语句之后的代码开始,继续执行我们的应用程序

3、try…catch…finally 异常处理的组合方式

  • try catch finally组合: 检测异常,并传递给catch 处理,并在finally中进行资源释放;
  • try catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对异常进行捕获处理;
  • 多个try catch组合 当可能有多种类型的异常发生的时候,我把可能产生某异常类型的代码分开,分别放在不同的try-catch代码块中;
  • 一个try多个catch组合: 对代码进行异常检测,并对检测的异常传递给catch处理,对每种异常信息进行不同的捕获处理;
  • try finally组合: 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出,异常是没有捕获处理的。但是功能所开启资源需要进行关闭,所以finally只为关闭资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb:Servlet的应用及接口介绍

广义的 Servlet 泛指在服务器上运行的 Java 程序&#xff0c;但是这个 Java 程序&#xff0c;并不能独立运行&#xff08;因为 Servlet 没有 main 方法&#xff09;&#xff0c;需要部署在相应的 Servlet 容器中&#xff0c;比如 Tomcat 和 Jetty。Servlet 主要功能在于交互式地…

DOCKERFILE参数注解

Dockerfile由一行行命令语句组成&#xff0c;并且支持以#开头的注释行。 一般的&#xff0c;Dockerfile 分为四部分&#xff1a;基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。 Dockerfile的指令是忽略大小写的&#xff0c;建议使用大写&#xff0c;使用 # 作为…

Zookeeper:分布式过程协同技术

Zookeeper 是一个高性能的分布式一致系统&#xff0c;在分布式系统中有着广泛的应用。基于它&#xff0c;可以实现诸如“分布式同步”、“配置管理”、“命名空间管理”等众多功能&#xff0c;是分布式系统中常见的基础系统。Zookeeper 主要用来解决分布式集群中应用系统的一致…

面试题2021-2-24

给某CentOs6虑拟机添加了新的数据盘&#xff0c;设备名为/de/sdd.写命令格式化满加的效的并挂载到指定目录/opt fdisk -l mkfs.ext4 /de/sdd mount /de/sdd /opt 如何查看与RabbtMQ服务器之间的establish状态连接数&#xff1f;netstat -an |grep ESTABLISHED |grep tcp |wc -l…

Zookeeper:在三种模式下的部署

zookeeper 安装模式有三种&#xff1a;单机模式&#xff1a;单机单 server&#xff1b;集群模式&#xff1a;多机多 server&#xff0c;形成集群&#xff1b;伪集群模式&#xff1a;单机多 server&#xff0c;形成伪集群。 ~ 本篇内容包括&#xff1a;Zookeeper 官网下载、Zook…

Linux namespace概述

操作系统通过虚拟内存技术&#xff0c;使得每个用户进程都认为自己拥有所有的物理内存&#xff0c;这是操作系统对内存的虚拟化。操作系统通过分时调度系统&#xff0c;每个进程都能被【公平地】调度执行&#xff0c;即每个进程都能获取到CPU&#xff0c;使得每个进程都认为自己…

Zookeeper:Zookeeper的主从选举机制

ZAB 协议&#xff0c;全称 Zookeeper Atomic Broadcast&#xff08;Zookeeper 原子广播协议&#xff09;&#xff0c;是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的一致性协议。基于该协议&#xff0c;ZooKeeper 实现了一种主从模式的系统架构来保持集群中各个副…

Linux namespace之:uts namespace

理解uts namespace uts(UNIX Time-Sharing System) namespace可隔离hostname和NIS Domain name资源&#xff0c;使得一个宿主机可拥有多个主机名或Domain Name。换句话说&#xff0c;可让不同namespace中的进程看到不同的主机名。 例如&#xff0c;使用unshare命令(较新版本L…

Zookeeper:事件监听和通知机制

Zookeeper 允许客户端向服务端的某个 Znode 注册一个 Watcher 监听&#xff0c;当服务端的一些指定事件触发了这个 Watcher&#xff0c;服务端会向指定客户端发送一个事件通知来实现分布式的通知功能&#xff0c;然后客户端根据 Watcher 通知状态和事件类型做出业务上的改变。 …

Linux namespace之:mount namespace

理解mount namespace 用户通常使用mount命令来挂载普通文件系统&#xff0c;但实际上mount能挂载的东西非常多&#xff0c;甚至连现在功能完善的Linux系统&#xff0c;其内核的正常运行也都依赖于挂载功能&#xff0c;比如挂载根文件系统/。其实所有的挂载功能和挂载信息都由内…

Linux namespace之:network namespace

理解network namespace network namespace用来隔离网络环境&#xff0c;「在network namespace中&#xff0c;网络设备、端口、套接字、网络协议栈、路由表、防火墙规则等都是独立的」。 因network namespace中具有独立的网络协议栈&#xff0c;因此每个network namespace中都…

Kubernetes 的原理

kubernetes 已经成为容器编排领域的王者&#xff0c;它是基于容器的集群编排引擎&#xff0c;具备扩展集群、滚动升级回滚、弹性伸缩、自动治愈、服务发现等多种特性能力。 本文将带着大家快速了解 kubernetes &#xff0c;了解我们谈论 kubernetes 都是在谈论什么。 kuberne…

Zookeeper:实现“分布式锁”的 Demo

Zookeeper 能保证数据的强一致性&#xff0c;用户任何时候都可以相信集群中每个节点的数据都是相同的。一个用户创建一个节点作为锁&#xff0c;另一个用户检测该节点&#xff0c;如果存在&#xff0c;代表别的用户已经锁住&#xff0c;如果不存在&#xff0c;则可以创建一个节…

JavaIO流:案例

java.io 包下需要掌握的流有 16 个&#xff0c;本篇内容包括&#xff1a;java.io包下需要掌握的流、Java IO 案例。 文章目录一、java.io包下需要掌握的流二、Java IO 案例1、Demo 1&#xff08;FileInputStream&#xff09;2、Demo 2&#xff08;FileInputStream&#xff09;3…

比对excel数据

#!/usr/bin/env pythonimport openpyxl from openpyxl.styles import PatternFill from openpyxl.styles import colors from openpyxl.styles import Font, Color aD:/测算单位设置/比对/吉林/tmp001.xlsx bD:/测算单位设置/比对/吉林/国网吉林电力.xlsx cD:/测算单位设置/比对…

CPU 是如何执行任务的

前言 你清楚下面这几个问题吗&#xff1f; 有了内存&#xff0c;为什么还需要 CPU Cache&#xff1f; CPU 是怎么读写数据的&#xff1f; 如何让 CPU 能读取数据更快一些&#xff1f; CPU 伪共享是如何发生的&#xff1f;又该如何避免&#xff1f; CPU 是如何调度任务的&a…

Ansible 的自动化运维

1、Ansible 特点 Ansible 自 2012 年发布以来&#xff0c;很快在全球流行&#xff0c;其特点如下&#xff1a; Ansible 基于 Python 开发&#xff0c;运维工程师对其二次开发相对比较容易&#xff1b; Ansible 丰富的内置模块&#xff0c;几乎可以满足一切要求&#xff1b; …

Shell 信号发送与捕捉

1、Linux信号类型 信号&#xff08;Signal&#xff09;&#xff1a;信号是在软件层次上对中断机制的一种模拟&#xff0c;通过给一个进程发送信号&#xff0c;执行相应的处理函数。 进程可以通过三种方式来响应一个信号&#xff1a; 1&#xff09;忽略信号&#xff0c;即对信…

运维面试题总结

集群相关 简述 ETCD 及其特点&#xff1f; etcd 是 CoreOS 团队发起的开源项目&#xff0c;是一个管理配置信息和服务发现&#xff08;service discovery&#xff09;的项目&#xff0c;它的目标是构建一个高可用的分布式键值&#xff08;key-value&#xff09;数据库&#x…

详解设计模式:建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;也叫做生成器模式&#xff0c;是 GoF 的 23 种设计模式的一种&#xff0c;它将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 当我们需要实列化一个复杂的类&#xff0c;以得到不同结…