进阶JAVA篇-异常处理:解读与解决编程中的意外情况

目录

        1.0 什么是异常?

        1.1 异常主要分为两个情况分别是运行时异常、编译时异常。

        2.0 怎么处理异常呢?

        2.1 捕获异常(Catch Exception)

         2.2 声明异常(Declare Exception)

         3.0 自定义异常

        3.1 如何定义异常类?

        3.2 自定义运行异常

        3.3 自定义编译异常

        3.4 区别 throw 与 throws 

        4.0 用例子进一步了解异常的魅力:


        1.0 什么是异常?

        异常是在程序执行过程中出现的意外或不正常的情况。当程序遇到无法处理的错误、意外输入或其他不符合预期的情况时,会引发异常。这可能包括但不限于:除以零、访问不存在的变量、文件读取错误等。异常会打断程序的正常执行流程,并通过抛出异常的方式通知程序员或系统。简单来说就是,就是代表程序出现了问题。

        1.1 异常主要分为两个情况分别是运行时异常、编译时异常。

        运行时异常:指继承自 RuntimeException 的异常类。它们是在程序运行期间可能抛出的异常,通常表示程序中的逻辑错误或错误的使用方式,运行时异常不需要在方法签名中声明或捕获。这意味着你可以选择捕获或不捕获运行时异常,而不会导致编译错误。

常见的运行时异常包括:

  1. NullPointerException(空指针异常):当尝试访问一个空对象的成员时抛出。
  2. IllegalArgumentException(非法参数异常):当传递给方法的参数不合法或无效时抛出。
  3. IllegalStateException(非法状态异常):当对象的状态不符合方法调用的前提条件时抛出。
  4. IndexOutOfBoundsException(索引越界异常):当尝试访问数组或集合中不存在的索引时抛出。
  5. ArithmeticException(算术异常):当出现除以零或其他算术错误时抛出。

运行异常指的是在编译的时候不会去"干扰"程序员,只有在运行的时候出现了类似以上的情况就会报异常。

        举例来说明一下运行异常:

        可以看出来在 IDEA 这个编译器中在编译代码的过程中,并没有很强烈的提示哪里出现了异常。

运行结果如下:

        明确表示了是运行异常。

 

         编译异常:指在编译阶段可能发生的异常,需要在代码中显式地处理或声明。它们是指继承自 Exception(但不是 RuntimeException )的异常类。与运行时异常不同,编译时异常必须在方法签名中声明,或者在方法内部进行捕获和处理,否则会导致编译错误。

常见的编译时异常包括:

  1. IOException(输入输出异常):当发生输入或输出错误时抛出,如文件读取错误、网络连接错误等。
  2. SQLException(SQL异常):当执行SQL操作时发生错误时抛出,如数据库连接错误、SQL语法错误等。
  3. ClassNotFoundException(类未找到异常):当尝试加载不存在的类时抛出。
  4. InterruptedException(中断异常):当线程在等待、休眠或阻塞状态时被中断时抛出。
  5. FileNotFoundException(文件未找到异常):当尝试访问不存在的文件时抛出。

 编译异常指的是在编写代码的时候就出现了异常,要求程序员必须要对这个代码进行处理,这个异常才会被解决。

        举例来说明一下编译异常:

        关注两个点,第一点就是在编写代码的时候 IDEA 编译器就出现了很强烈的提醒,表明了波浪线,是为了提醒程序员这个点很容易出错。第二点,如果对编译异常不采取任何的声明或者捕获的方式时,就会程序会直接报错了,程序运行不了了。

具体的处理异常的方式以下内容会讲到。

        2.0 怎么处理异常呢?

        处理异常的方式可以分为两种:捕获异常和声明异常。

        2.1 捕获异常(Catch Exception

捕获异常(Catch Exception):使用 try-catch 语句块来捕获异常并处理异常情况。try 块中包含可能抛出异常的代码,catch 块用于捕获并处理异常。捕获异常可以防止程序因异常而终止,并提供了对异常情况的处理机制。

import java.text.ParseException;
import java.util.Date;
import java.text.SimpleDateFormat;public class CompilationException {public static void main(String[] args) {Date date = null;try {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String str = "2028-12-1 12:00:00";date = simpleDateFormat.parse(str);} catch (ParseException e) {throw new RuntimeException(e);}System.out.println(date);}
}

对编译异常采取了捕获异常的方式进行处理。补充一下,在大部分情况中,普通的运行异常没有必要采取捕获异常或者是声明异常处理。但是对于自定义的运行异常很有必要采取相应发措施对异常处理。

 

         2.2 声明异常(Declare Exception

 声明异常(Declare Exception)是在方法签名中声明可能抛出的异常类型。通过在方法声明中使用 throws 关键字列出可能抛出的异常,将异常的责任转移到调用方。调用方必须处理或继续声明这些异常,否则会导致编译错误。

import java.text.ParseException;
import java.util.Date;
import java.text.SimpleDateFormat;public class CompilationException {public static void main(String[] args) throws ParseException {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String str = "2028-12-1 12:00:00";Date date =  simpleDateFormat.parse(str);System.out.println(date);}
}

对编译异常采取了声明异常的方式进行处理。用了 throws 关键字。

         3.0 自定义异常

        自定义异常是指根据特定的需求和场景,自行定义的异常类。通过自定义异常,可以提供更具体和可读性的异常信息,以便于开发人员在程序出现错误时能够更好地理解和调试问题。简单的来说就是 Java 无法为世界上的所有问题都提供异常类来代表,如果企业自己的某种问题,相通过异常来表示,那就需要自己来定义异常类了。

        3.1 如何定义异常类?

        因为有两种类型的异常,所以方式会稍微不同,但是情况大部分都是一样的。

        3.2 自定义运行异常

        先定义一个类继承 RuntimeException ,然后重写有参数的构造器,最后通过 new 自定义的类并且在构造器中传入需要报错的信息,再通过关键字 throw 抛出这个对象。

代码如下:

public class AgeAbnormalities extends RuntimeException{public AgeAbnormalities(String message) {super(message);}
}
public class RunException {public static void main(String[] args) {fun(300);}public static void fun(int age){if (age>0 && age < 200){System.out.println(age);}else {System.out.println("输入不合法");throw  new AgeAbnormalities("The age you entered is not legal");}}
}

运行结果如下:

 

        3.3 自定义编译异常

        先定义一个异常类继承 Exception ,任何重写有参数的构造器,通过 throw new 异常类() 来创建异常对象并抛出。

代码如下:

public class AgeCompilationException extends Exception{public AgeCompilationException(String message) {super(message);}
}
public class CompilationException {public static void main(String[] args) throws Exception{fun(300);}public static void fun(int age) throws Exception{if (age > 0 && age < 200){System.out.println(age);}else {throw new AgeCompilationException("The age you entered is not legal");}}
}

需要注意的是:对于自定义编译异常,在编写完 throw new AgeCompilationException("The age you entered is not legal");  这条语句之后,需要通过 throws 关键字声明异常,接着调用这个函数也需要用到声明异常或者捕获异常对编译异常处理。

运行结果如下:

 

        3.4 区别 throwthrows 

        throw throws 是 Java 中用于处理异常的关键字。

        throw 关键字用于抛出一个异常对象。它通常用于方法内部,用于在特定的条件下主动抛出异常。使用 throw 关键字时,需要提供一个异常对象作为参数,该异常对象可以是 Java 内置的异常类,也可以是自定义的异常类。

        throws 关键字用于在方法声明中指定可能抛出的异常类型。它用于告诉调用者,该方法可能会抛出某些异常,调用者需要进行相应的异常处理。使用 throws 关键字时,需要在方法声明后面跟上异常类型,可以是一个或多个异常类型,多个异常类型之间使用逗号分隔。

 

        4.0 用例子进一步了解异常的魅力:

import java.util.Scanner;
public class Text_Exception {public static void main(String[] args) {while (true) {try {getMoney();break;} catch (Exception e) {System.out.println("请输入数字!!!");}}}public static void getMoney(){Scanner scanner = new Scanner(System.in);while (true) {System.out.println("请输入价格:");double money = scanner.nextDouble();if (money > 0){System.out.println(money);break;}else {System.out.println("输入不合法,请重新输入!!!");}}}
}

运行结果如下:

         具体作用就算非法输入不是数字时,程序都不会崩,而是尝试重新修复。所以这个程序非常健壮!自己去感受感受遇到这种情况的时候,是否可以用异常来解决。

 这里有更多内容:小扳_-CSDN博客



 

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

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

相关文章

Linux:进程控制

目录 一、进程创建 写时拷贝 二、进程终止 echo $? 如何终止进程 _exit与exit 三、进程等待 进程等待的必要性 进程等待的操作 wait waitpid status 异常退出情况 status相关宏 options 四、进程程序替换 1、关于进程程序替换 2、如何进行进程程序替换 程序…

【深度学习】【Opencv】【GPU】python/C++调用onnx模型【基础】

【深度学习】【Opencv】【GPU】python/C调用onnx模型【基础】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【Opencv】【GPU】python/C调用onnx模型【基础】前言Python版本OpenCVWindows平台安装OpenCVopencv调用onnx模型 C版本…

vue 自定义指令

vue 自定义指令 指令 和mounted 是什么关系 &#xff1f; **创建 工程&#xff1a; H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day05\准备代码\04-自定…

反转链表(java)

大家好我是苏麟今天说一说链表常见的简单题目 . BM1 反转链表 牛客BM1 反转链表 : 描述 : 给定一个单链表的头结点(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 分析 : …

云上攻防-云原生篇K8s安全Config泄漏Etcd存储Dashboard鉴权Proxy暴露

文章目录 云原生-K8s安全-etcd未授权访问云原生-K8s安全-Dashboard未授权访问云原生-K8s安全-Configfile鉴权文件泄漏云原生-K8s安全-Kubectl Proxy不安全配置 云原生-K8s安全-etcd未授权访问 攻击2379端口&#xff1a;默认通过证书认证&#xff0c;主要存放节点的数据&#x…

【Linux-常用命令-基础命令-复制-copy-命令-笔记】

【Linux-常用命令-基础命令-复制文件-copy-命令-笔记】 1、前言2、操作3、自己的实践 1、前言 最近&#xff0c;在使用Linux的时&#xff0c;使用相关基础命令是&#xff0c;总是容易忘记&#xff0c;上网一搜&#xff0c;大部分都写的比较繁琐&#xff0c;我就找下复制命令&a…

Anylogic 读取和写入Excel文件

1、选择面板-连接-Excel文件&#xff0c;拖入到视图中 然后在excel文件的属性中进行绑定外部excel文件。 绑定完之后&#xff0c;在你需要读取的地方进行写代码&#xff0c; //定义开始读取的行数 //这里设为2&#xff0c;是因为第一行是数据名称 int row12; //读取excel文件信…

[开源]MIT开源协议,基于Vue3.x可视化拖拽编辑,页面生成工具

一、开源项目简介 AS-Editor 基于 Vue3.x 可视化拖拽编辑&#xff0c;页面生成工具。提升前端开发效率&#xff0c;可集成至移动端项目作为通过定义 JSON 直接生成 UI 界面。 二、开源协议 使用MIT开源协议 三、界面展示 四、功能概述 基于Vue可视化拖拽编辑&#xff0c;…

Web3 整理React项目 导入Web3 并获取区块链信息

上文 WEB3 创建React前端Dapp环境并整合solidity项目&#xff0c;融合项目结构便捷前端拿取合约 Abi 我们用react 创建了一个 dapp 项目 并将前后端代码做了个整合 那么 我们就来好好整理一下 我们的前端react的项目结构 我们在 src 目录下创建一个 components 用来存放我们的…

视频怎么压缩?视频太大这样处理变小

在当今时代&#xff0c;视频已经成为了我们日常生活中不可或缺的一部分&#xff0c;然而&#xff0c;视频文件往往非常大&#xff0c;给我们的存储和传输带来了很大的不便&#xff0c;那么&#xff0c;如何有效地压缩视频呢&#xff1f; 一、使用压缩软件 首先我们给大家分享一…

python的搜索引擎系统设计与实现 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python的搜索引擎系统设计与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;5分创新点&#xff1a;3分 该项目较为新颖&#xff…

5.覆盖增强技术——PUCCHPUSCH

PUSCH增强方案的标准化工作 1.PUSCH重复传输类型A增强&#xff0c;包括两种增强机制&#xff1a;增加最大重复传输次数&#xff0c;以及基于可用上行时隙的重复传输次数技术方式。 2.基于频域的解决方案&#xff0c;包括时隙间/时隙内跳频的增强 3.支持跨多个时隙的传输块&…

Hadoop3教程(六):HDFS中的DataNode

文章目录 &#xff08;63&#xff09;DataNode工作机制&#xff08;64&#xff09;数据完整性&#xff08;65&#xff09;掉线时限参数设置参考文献 &#xff08;63&#xff09;DataNode工作机制 DataNode内部存储了一个又一个Block&#xff0c;每个block由数据和数据元数据组…

1-k8s1.24-底座搭建-基于containerd

文章目录 一、服务器准备二、安装Containerd三、安装k8s四、安装部署dashboard ps&#xff1a;第一遍搭建ks8的时候&#xff0c;由于k8s在1.24版本之后就放弃了对docker的支持&#xff0c;如果要继续使用docker需要自己加载插件。所以一开始就是直接使用 k8s1.24containerd进行…

基于下垂控制的孤岛双机并联逆变器环流抑制MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 在实际应用中逆变器都是并联运行的,但是逆变器的并联运行也存在不少问题,由于线路阻抗差异、各个逆变器输出端瞬时电压幅值不同等,都容易导致环流的出现。环流会导致逆变器损耗增加,从而影响微电网的输出效率…

Megatron-LM GPT 源码分析(二) Sequence Parallel分析

引用 本文基于开源代码 https://github.com/NVIDIA/Megatron-LM &#xff0c;延续上一篇Megatron-LM GPT 源码分析&#xff08;一&#xff09; Tensor Parallel分析 通过对GPT的模型运行示例&#xff0c;从三个维度 - 模型结构、代码运行、代码逻辑说明 对其源码做深入的分析。…

Spring Boot中的常用注解

Spring Boot中的常用注解 深入探讨Spring Boot中的常用注解摘要引言一、认识Spring BootSpring Boot简介和核心概念核心概念详解1. 自动配置2. 起步依赖3. 嵌入式Web服务器 二、Spring中常用注解Spring框架中的关键注解概览Spring框架中的关键注解概览1. Autowired2. Component…

GaussDB for openGauss部署形态

前言 华为云数据库GaussDB是华为自主创新研发的分布式关系型数据库&#xff0c;具有高性能、高可用、高安全、低成本的特点&#xff0c;本文带你详细了解GaussDB数据库的部署形态。 1、GaussDB部署形态三种类型 GaussDB部署形态&#xff1a;单机 独立部署是将数据库组件部署…

prometheus获取kubelet接口监控数据

一、前言 k8s集群的kubelet服务内部有自带的cadvisor服务用于收集k8s集群的监控数据&#xff0c;所以可以通过调用kubelet的接口就能获取pod的资源监控数据&#xff0c;在新版本的k8s中&#xff0c;kubelet的监控数据获取端口为10250端口&#xff0c;老版本的是10255端口 二、…

基于Scrapyd与Gerapy部署scrapy爬虫方案【可用于分布式爬虫部署】

scrapyd部署爬虫 Scrapyd 是一个基于 Scrapy 的开源项目&#xff0c;它提供了一个简单的方式来部署、运行和监控 Scrapy 爬虫。它是一个用于集成 Scrapy 爬虫到分布式架构中的工具&#xff0c;允许您在分布式环境中运行爬虫&#xff0c;并提供了一组 Web API&#xff0c;用于管…