Java异常详解

Java 异常详解

Execption 和 Error 有什么区别?

  • execption 是程序可自行处理的异常,可以通过 catch 进行捕获,可分为两类: Checked Exception (受检查异常,必须处理)和 Unchecked Exception (不受检查异常,可以不处理)
  • error 程序无法自行处理的错误,不建议通过 catch 进行捕获,因为有些错误一般会导致 JVM 直接终止线程。

受检查异常和不受检查异常有什么区别?

  • 受检查异常(其他的 Exception 类及其子类) ,Java 代码在编译过程中,如果受检查异常没有被 catch 或者 throws 关键字处理的话,就没办法通过编译。(比如 IO 相关的异常,SQL 异常)
  • 不受检查异常( RuntimeException 及其子类) ,Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。(比如空指针异常、参数错误异常)

Throwable 类常用方法有哪些?

  • String getMessage(): 返回异常发生时的简要描述

  • String toString(): 返回异常发生时的详细信息

  • String getLocalizedMessage(): 返回异常对象的本地化信息

    • 使用 Throwable 的子类覆盖这个方法,可以生成本地化信息。

    • 如果子类没有覆盖该方法,则该方法返回的信息与 getMessage() 返回的结果相同。

      这是因为 Throwable 类中的默认实现是返回 getMessage() 的结果作为本地化信息。

  • void printStackTrace(): 在控制台上打印 Throwable 对象封装的异常信息。

try-catch-finally 如何使用?

  • try 块:用于捕获异常。其后可接零个或多个 catch 块,如果没有 catch 块,则必须跟一个 finally 块。
  • catch块:用于处理 try 捕获到的异常。
  • finally 块:无论是否捕获或处理异常,finally 块里的语句都会被执行。当在 try 块或 catch 块中遇到 return 语句时,finally 语句块将在方法返回之前被执行。

注意:不要在 finally 语句块中使用 return!

当 try 语句和 finally 语句中都有 return 语句时,try 语句块中的 return 语句会被忽略。

这是因为 try 语句中的 return 返回值会先被暂存在一个本地变量中(从字节码中可以看出),当执行到 finally 语句中的 return 之后,这个本地变量的值就变为了 finally 语句中的 return 返回值。(简单来说,就是本地变量会被覆盖)

代码示例:

public static void main(String[] args) {System.out.println(f(2)); // 输出 0System.out.println("--------------------");int i = 0;try {i++;return i; // i = 1, 会先被一个本地变量存储起来,最后返回} finally {i++;System.out.println(i); // 输出 2}
}public static int f(int value) {try {return value * value;} finally {if (value == 2) {return 0;}}
}

输出:

0
--------------------
2
1

finally 中的代码一定会执行吗?

不一定!

在三种情况下,finally 块的代码也不会被执行:

  1. finally 之前虚拟机被终止运行。(System.exit(1);)
  2. 程序所在的线程死亡。
  3. 关闭 CPU。

什么是 try-with-resources

try-with-resources 是 Java 7 引入的一个新特性,用于自动关闭实现了 java.lang.AutoCloseable 或者 java.io.Closeable 接口的资源。

它可以替代传统的 try-catch-finally 语句,使代码更加简洁和可读。

使用 try-with-resources 语句时,需要try 关键字后面的圆括号中声明资源,例如:

try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {System.out.println(br.readLine());
}

在这个例子中,BufferedReader 实现了 java.lang.AutoCloseable 接口,因此可以在 try 语句中声明并自动关闭。在 try 语句执行完毕后,BufferedReader 会自动关闭,无需手动调用其 close() 方法

如果同时声明多个资源,可以使用分号 ; 分隔,例如:

try (InputStream in = new FileInputStream("input.txt");OutputStream out = new FileOutputStream("output.txt")) {// 读取并写入数据
}

try 语句执行完毕后,会自动关闭 InputStreamOutputStream

  1. 适用范围(资源的定义): 任何实现 java.lang.AutoCloseable或者 java.io.Closeable 的对象。
  2. 关闭资源和 finally 块的执行顺序:try-with-resources 语句中,任何 catch 或 finally 块在声明的资源关闭后运行。
  3. **作用:**使用 try-with-resources 语句可以避免一些常见的错误,如忘记关闭资源、关闭资源时发生异常等问题。它还可以使代码更加简洁和易读,不需要编写冗长的 try-catch-finally 语句。

异常使用有哪些需要注意的地方?

  • 不要把异常定义为静态变量,因为这样会导致异常栈信息错乱。每次手动抛出异常,我们都需要手动 new 一个异常对象抛出。

    例如:

    public class CustomException extends Exception {// 定义异常的静态常量public static final CustomException INVALID_INPUT = new CustomException("Invalid input");public static final CustomException NOT_FOUND = new CustomException("Not found");public CustomException(String message) {super(message);}
    }
    public class Main {public static void main(String[] args) {try {throw CustomException.INVALID_INPUT;} catch (CustomException e) {System.out.println(e.getMessage());}}
    }
    
  • 抛出的异常信息一定要有意义。

  • 建议抛出更加具体的异常比如字符串转换为数字格式错误的时候应该抛出 NumberFormatException 而不是其父类 IllegalArgumentException

  • 使用日志打印异常之后就不要再抛出异常了(两者不要同时存在一段代码逻辑中)。

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

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

相关文章

深度学习框架配置

目录 1. 配置cuda环境 1.1. 安装cuda和cudnn 1.1.1. 显卡驱动配置 1.1.2. 下载安装cuda 1.1.3. 下载cudnn,将解压后文件复制到cuda目录下 1.2. 验证是否安装成功 2. 配置conda环境 2.1. 安装anaconda 2.2. conda换源 2.3. 创建conda环境 2.4. pip换源 3.…

【工作记录】spider-flow使用插件连接并操作mongodb数据库

前言 前面说过,spider-flow有着非常优秀的插件机制,可以通过插件实现功能的扩展。前面有小伙伴问到mongodb的集成使用,本文就来梳理下spider-flow中使用mongodb插件的过程,其实非常简单。 PS: spider-flow的作者已经实现了一些常…

飞翔的小鸟小游戏

主类 package APP;import 框架.GameFrame;public class GameApp {public static void main(String[] args) {//游戏的入口new GameFrame();} }场景实物 package 框架;import 图导.Constant; import 图导.GameUtil;import java.awt.*; import java.awt.image.BufferedImage; …

C语言——数字金字塔

实现函数输出n行数字金字塔 #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>void pyramid(int n) {int i,j,k;for (i1; i<n; i){//输出左边空格&#xff0c;空格数为n-i for (j1; j<n-i; j){printf(" "); } //每一行左边空格输完后输出数字&#…

STM32g70开启定时器死机原因

在做低功耗产品时&#xff0c;检查发现由于之前开启了BOOTLOADER升级程序&#xff0c;修改了中断向量FALSH起始地址&#xff0c;只在KEIL TARGET IROM1中修改了&#xff0c; 而忘记在程序文件system_stm32f10x.c里修改中断向量表flash起始地址 system_stm32f10x.c里&#xff0…

8款前端特效动画及源码分享

3D立体数字时钟滚动特效 基于Splitting制作的一款3D立体数字时钟滚动特效&#xff0c;创意感满满&#xff0c;可以下载使用。 预览获取 核心代码 <div class"clock"><span class"cog hours tens" data-splitting>0123456789</span>&l…

智能优化算法应用:基于鸡群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鸡群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鸡群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鸡群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

EZDML基本介绍

一、表结构设计器(EZDML) 这是一个数据库建表的小软件&#xff0c;可快速的进行数据库表结构设计&#xff0c;建立数据模型。类似大家常用的数据库建模工具如PowerDesigner、ERWIN、ER-Studio和Rational-Rose等的超级精简版。 官方下载地址&#xff1a;http://www.ezdml.com/d…

一文教你uni-app开发小程序直播功能,轻松打造专属直播间!

1、微信后台申请插件开通 微信后台 登录微信后台 点击设置中的第三方设置 —> 添加插件 --> 点击小程序直播组件&#xff08;获取AppID&#xff09; 2、微信后台开通直播功能 点击进入直播后台系统 这里就是我们创建的直播功能区域 3、代码中接入直播插件AppID 支持在…

Django实现websocket完成实时通讯,聊天室,在线客服等

websocket协议分析 一 什么是Websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。 在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xf…

思维导图软件MindNode 5 mac使用场景

MindNode 5 for Mac是一款思维导图软件产品&#xff0c;为用户在灵感启发、思绪整理、记忆协助、项目规划、授课讲演等诸多场景下提升学习和工作效率。通过导图社区和云文件无缝链接用户设备&#xff0c;方便用户随时随地收集灵感和展示文档。 MindNode 5 for Mac应用场景 助力…

python 继承父类的变量和方法

[root@zz python]# cat a1.py # !/usr/bin/env python # -*- coding: utf-8 -*- class AddrBookEntry(object): ##类定义 def __init__(self,a,b): ##定义构造器 self.var1=a+9 self.var2=b+11 def updatePhone(self, num): # 定义方法 sel…

【axios】TypeScript实战,结合源码,从0到1教你封装一个axios - 基础封装篇

目录 前言版本环境变量配置引入的类型1、AxiosIntance: axios实例类型2、InternalAxiosRequestConfig: 高版本下AxiosRequestConfig的拓展类型3、AxiosRequestConfig: 请求体配置参数类型4、AxiosError: 错误对象类型5、AxiosResponse: 完整原始响应体类型 目标效果开始封装骨架…

【古月居《ros入门21讲》学习笔记】15_ROS中的坐标系管理系统

目录 说明&#xff1a; 1. 机器人中的坐标变换 tf功能包能干什么&#xff1f; tf坐标变换如何实现 2. 小海龟跟随实验 安装 ros-melodic-turtle-tf 实验命令 运行效果 说明&#xff1a; 1. 本系列学习笔记基于B站&#xff1a;古月居《ROS入门21讲》课程&#xff0c;且使…

KT1404C语音芯片做的板子连接usb到电脑出来空的盘符 怎么处理?

一、问题简介 KT1404C画的板子&#xff0c;连接usb到电脑&#xff0c;出来空的盘符&#xff0c;可以确定KT404C没问题放别的板子OK&#xff0c;就是这个板子不正常&#xff0c;并且芯片5脚的电压输出是3.5v &#xff0c;正常的板子是3.3v&#xff0c;什么问题呢&#xff1f; 问…

数据结构之二叉树与堆以及力扣刷题函数扩展

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力 目录 1.前言 2.树 2.1概念 2.2树的相关概念 3.…

Python自动化办公:PDF文件的加密与解密

在本篇文章中&#xff0c;我们将介绍如何使用PyPDF2库对PDF文件进行加密和解密操作。 包括如何给PDF文件添加密码&#xff0c;以及如何从受密码保护的PDF文件中删除密码。 注&#xff1a;删除密码的操作&#xff0c;前提是需要知道密码哦 1. 安装PyPDF2库 首先&#xff0c;…

2023.11.26使用opencv调节图片亮度

2023.11.26使用opencv调节图片亮度 测试一些opencv对图片的处理效果&#xff0c;方法比较简单&#xff0c;找出所有像素点&#xff0c;然后将RGB三色的亮度分别进行调节即可&#xff0c;同类可以进行像素级的处理。测试结果和项目代码如下&#xff1a; 使用OpenCV调节图拍亮…

物理层之码分复用(内含相关例题)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

数字人透明屏幕的技术原理是什么?

数字人透明屏幕的技术原理主要包括人脸识别和全息影像技术。其中&#xff0c;人脸识别技术是通过摄像头捕捉游客的面部表情和动作&#xff0c;并将其转化为数据指令&#xff0c;以便与数字人物进行互动。而全息影像技术则是利用透明屏幕&#xff0c;通过全息投影的方式将数字人…