Java正确的错误捕获姿态

在这里插入图片描述

理论概述

在Java中,捕获异常并且合理地处理或抛出异常是编写健壮和可靠代码的关键部分。但是有时候我们可能会对各种错误的捕获方法有点模棱两可,不知道怎么合适的去使用,这里作为基础知识我们做一个回顾巩固!只有正确的开发方法,我们才能提高效率,减少不必要的错误和弯路!!!
以下是一些关于如何在Java中合理捕获和处理异常的准则:

  1. 只捕获你知道如何处理的异常: 不要捕获所有异常,而是只捕获你知道如何处理的异常。捕获所有异常可能会隐藏真正的问题,使调试变得困难。

  2. 使用多个catch块: 使用多个catch块来处理不同类型的异常,以便分别处理它们。从特定到通用的顺序排列catch块,以免某个特定异常被通用异常捕获块所隐藏。

try {
    // 可能抛出异常的代码
} catch (SpecificException e) {
    // 处理特定异常
} catch (AnotherSpecificException e) {
    // 处理另一个特定异常
} catch (Exception e) {
    // 处理通用异常
}
  1. 捕获异常后是否继续执行: 根据情况决定是否在捕获异常后继续执行代码。有时,捕获异常后可能需要进行清理操作,然后继续执行。

  2. 使用finally块: 使用finally块来确保资源的释放,无论是否发生了异常。finally块中的代码总是会执行,即使在try块中抛出了异常。

try {
    // 可能抛出异常的代码
} catch (Exception e) {
    // 处理异常
} finally {
    // 清理操作,例如关闭资源
}
  1. 抛出自定义异常: 在某些情况下,可能需要抛出自定义异常,以便更好地表示程序中的问题。创建自定义异常类继承自Exception或其子类。
public class CustomException extends Exception {
    // 构造函数等
}
  1. 不要忽略异常: 不要简单地将异常吞噬,而是要适当地记录异常信息,以便后续的调试和排查。

  2. 使用日志: 使用合适的日志框架(如Log4j、SLF4J等)记录异常信息,以便在程序运行过程中捕获异常和调试时进行追踪。

  3. 避免空的catch块: 避免在catch块中什么都不做,这可能会导致难以诊断的问题。

实例演示

当编写Java代码时,可能会遇到各种常见的异常情况,下面是一些常见的错误捕获的例子,我们作为参考:

  1. 空指针异常(NullPointerException):
String str = null;
try {
    int length = str.length(); // 尝试调用null引用的方法
} catch (NullPointerException e) {
    System.out.println("空指针异常:" + e.getMessage());
}
  1. 数组索引越界异常(ArrayIndexOutOfBoundsException):
int[] arr = {1, 2, 3};
try {
    int value = arr[5]; // 尝试访问数组超出索引范围的元素
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("数组索引越界异常:" + e.getMessage());
}
  1. 类型转换异常(ClassCastException):
Object obj = "Hello";
try {
    Integer num = (Integer) obj; // 尝试将字符串转换为整数,但类型不匹配
} catch (ClassCastException e) {
    System.out.println("类型转换异常:" + e.getMessage());
}
  1. 除以零异常(ArithmeticException):
int dividend = 10;
int divisor = 0;
try {
    int result = dividend / divisor; // 尝试进行除法运算,除数为零
} catch (ArithmeticException e) {
    System.out.println("除以零异常:" + e.getMessage());
}
  1. 文件操作异常(IOException):
try {
    FileInputStream file = new FileInputStream("nonexistent-file.txt"); // 尝试打开不存在的文件
} catch (IOException e) {
    System.out.println("文件操作异常:" + e.getMessage());
}
  1. 自定义异常:
class CustomException extends Exception {
    public CustomException(String message) {
        super(message);
    }
}

try {
    if (condition) {
        throw new CustomException("自定义异常信息");
    }
} catch (CustomException e) {
    System.out.println("自定义异常:" + e.getMessage());
}
  1. 多重异常捕获:
try {
    // 一些可能抛出异常的代码
} catch (NullPointerException e) {
    // 处理空指针异常
} catch (ArrayIndexOutOfBoundsException e) {
    // 处理数组索引越界异常
} catch (Exception e) {
    // 处理其他异常
}

这些只是一些常见的错误捕获的例子,实际应用中可能会遇到更多不同类型的异常情况。根据具体的业务逻辑和需求,你可以选择适当的错误捕获方式,并且合理地处理异常,以确保代码的可靠性和稳定性。千万不要只是简单的随便抛出异常,或者是随便引入一个,给自己,给别人的调试都会带来一定的难度!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Arcgis将一个shp依照属性表导出为多个shp

# -*- coding:utf-8 -*-import arcpy import osfrom arcpy import env#env.workspace "./" #自己设置路径shp rC:\Users\Administrator\Desktop\Lake\xxx.shp #shp文件路径outpath r"C:\Users\Administrator\Desktop\Lake\fenli" #输出结果路径with arc…

IP提取器对比器

需求: 一个html 页面 ,有两个输入框 第一个输入框输入文本中包含多个ip,输入的ip是不规则的,需要使用正则表达式提取出 输入文本的ip地址 , 然后在第二个输入框中输入内容,并提取出内容的ip ,如…

VR全景在建筑工程行业能起到哪些作用?

在建筑工程领域,数字化技术为行业的发展起到巨大的推动作用,虽然建筑施工行业主要是依赖于工人劳动力和施工设备,但是VR全景在该行业中方方面面都能应用,从设计建模到项目交付,帮助建筑师以及项目方更好的理解每个环节…

Go语言进阶

个人笔记,大量摘自Go语言高级编程、Go|Dave Cheney等 更新 go get -u all 在非go目录运行go install golang.org/x/tools/goplslatest更新go tools:在go目录运行go get -u golang.org/x/tools/...,会更新bin目录下的应用; 运行…

灰度非线性变换之c++实现(qt + 不调包)

本章介绍灰度非线性变换,具体内容包括:对数变换、幂次变换、指数变换。他们的共同特点是使用非线性变换关系式进行图像变换。 1.灰度对数变换 变换公式:y a log(1x) / b,其中,a控制曲线的垂直移量;b为正…

两个状态的马尔可夫链

手动推导如下公式。 证明: 首先将如下矩阵对角化: { 1 − a a b 1 − b } \begin {Bmatrix} 1-a & a \\ b & 1-b \end {Bmatrix} {1−ab​a1−b​} (1)求如下矩阵的特征值: { 1 − a a b 1 − b } { x 1 x 2 } λ { x 1 x 2 }…

数据结构——空间复杂度

3.空间复杂度 空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。 空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。 空间复杂度计算规则基本跟实践复杂…

yolov5代码解读之yolo.py【网络结构】

​这个文件阿对于做模型修改、模型创新有很好大好处。 首先加载一些python库和模块: 如果要执行这段代码,直接在终端输入python yolo.py. yolov5的模型定义和网络搭建都用到了model这个类(也就是以下图片展示的东西):(以前代码没…

EasyPoi导出 导入(带校验)简单示例 EasyExcel

官方文档 : http://doc.wupaas.com/docs/easypoi pom的引入: <!-- easyPoi--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.0.0</version></dep…

学习笔记-JVM-工具包(JVM分析工具)

常用工具 JDK工具 ① jps: JVM Process status tool&#xff1a;JVM进程状态工具&#xff0c;查看进程基本信息 ② jstat: JVM statistics monitoring tool &#xff1a; JVM统计监控工具&#xff0c;查看堆&#xff0c;GC详细信息 ③ jinfo&#xff1a;Java Configuration I…

【学习】若依源码(前后端分离版)之 “ 获取角色权限信息及动态路由”

大型纪录片&#xff1a;学习若依源码&#xff08;前后端分离版&#xff09;之 “ 获取角色权限信息及动态路由” 获取用户信息获取路由信息 承接上回&#xff0c;我们发现在login请求后面跟了两个请求&#xff0c;今天我们就来了解一下两个请求的含义。 获取用户信息 先看 ‘…

MySQL及SQL语句(3)

MySQL及SQL语句(3) 文章目录 MySQL及SQL语句(3)一、多表查询1.1 准备sql1.2 笛卡尔积1.3 多表查询的分类&#xff1a;内连接查询外连接查询子查询多表查询练习 二、事务2.1 事务的基本介绍概念操作实例事务提交的两种方式 2.2 事务的四大特征原子性持久性隔离性一致性 2.3 事务…

SpringBoot学习——springboot整合email springboot整合阿里云短信服务

目录 引出springboot整合email配置邮箱导入依赖application.yml配置email业务类测试类 springboot整合阿里云短信服务申请阿里云短信服务测试短信服务获取阿里云的accessKeyspringboot整合阿里云短信导包工具类 总结 引出 1.springboot整合email&#xff0c;qq邮箱&#xff0c;…

第7章 通过内网本机IP获取微信code值及其对code值的回调。

在第5章中讲述了怎样通过内网穿透外外网从而获取微信code值&#xff0c;实际上微信测试帐号管理页中也支持通过内网本机IP获取微信code值。 1 重构launchSettings.json "https": { "commandName": "Project", "dotnetRunMessages": t…

vscode ssh远程的config/配置文件无法保存解决

问题 之前已经有了一个config&#xff0c;我想更改连接的地址和用户名&#xff0c;但是无法保存&#xff0c;显示需要管理员权限&#xff0c;但以管理员启动vscode或者以管理员权限保存都不行 未能保存“config”: Command failed: “D:\vscode\Microsoft VS Code\bin\code.c…

Docker 方式 部署 vue 项目 (docker + vue + nginx)

1.安装好 nginx 。 2. 把 vue 项目的源码克隆到确定目录下。用 git 管理&#xff0c;所以直接 git clone 到既定目录就行了。 如我的目录是&#xff1a;/root/jiangyu/projects/gentle_vue/gentle_vue_code 。 3. 项目打包&#xff1a; npm run build 复制 会自动生成 dist…

【QT】 QT开发PDF阅读器

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享QT开发PDF阅读器技术&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起进步&#xff01; 你的点…

matplotlib 笔记 plt.grid

用于添加网格线 主要参数 visible 布尔值&#xff0c;True表示画网格 which表示要显示的刻度线类型&#xff0c;可以是 major&#xff08;主刻度&#xff09;或 minor&#xff08;次刻度&#xff09;&#xff0c;或者同时显示&#xff08;both&#xff09;alpha 透明度 …

培训报名小程序-订阅消息发送

目录 1 创建API2 获取模板参数3 编写自定义代码4 添加订单编号5 发送消息6 发布预览 我们上一篇讲解了小程序如何获取用户订阅消息授权&#xff0c;用户允许我们发送模板消息后&#xff0c;按照模板的参数要求&#xff0c;我们需要传入我们想要发送消息的内容给模板&#xff0c…

Vue实战技巧:从零开始封装全局防抖和节流函数

前言 你是否曾经遇到过用户频繁点击按钮或滚动页面导致反应迟钝的问题&#xff1f;这是因为事件被连续触发&#xff0c;导致性能下降。在本文中&#xff0c;我将为大家介绍 vue 中的防抖和节流策略&#xff0c;并展示如何封装全局的防抖节流函数&#xff0c;以避免频繁触发事件…