程序人生——Java异常使用建议

news2024/9/21 22:53:31

在这里插入图片描述

目录

  • 引出
  • 异常
    • 建议110:提倡异常封装;
      • 建议111:采用异常链传递异常
    • 建议112:受检异常尽可能转化为非受检异常
      • 建议113:不要在finally块中处理返回值
    • 建议114:不要在构造函数中抛异常
      • 建议115:使用Throwable获得栈信息
    • 建议116:异常只为异常服务
      • 建议117:多使用异常,把性能问题放一边
  • 深入认识JVM
    • JVM内存分配,类加载
    • 创建对象的4种方法总结
    • 垃圾回收GC
    • JVM调优,Arthas使用
  • 认识多线程
    • 创建多线程方法+了解线程池
    • 多线程下-1非原子性问题即解决
    • 再论线程,创建、生命周期
  • 总结

引出

程序人生——Java异常使用建议


异常

建议110:提倡异常封装;

  • 异常封装有三方面的优点:
    • 1、提高系统的友好性;
    • 2、提高系统的可维护性;
    • 3、解决Java异常机制本身的缺陷;

建议111:采用异常链传递异常

  • 责任链模式(Chain of Responsibility),目的是将多个对象连城一条链,并沿着这条链传递该请求,直到有对象处理它为止,异常的传递处理也应该采用责任链模式

建议112:受检异常尽可能转化为非受检异常

  • 受检异常威胁到系统的安全性、稳定性、可靠性、正确性时、不能转为非受检异常)(受检异常(Checked Exception),非受检异常(Unchecked Exception),受检异常时正常逻辑的一种补偿处理手段,特别是对可靠性要求比较高的系统来说,在某些条件下必须抛出受检异常以便由程序进行补偿处理,也就是说受检异常有合理的存在理由。但是受检异常有不足的地方:1、受检异常使接口声明脆弱;2、受检异常是代码的可读性降低,一个方法增加了受检异常,则必须有一个调用者对异常进行处理。受检异常需要try…catch处理;3、受检异常增加了开发工作量。避免以上受检异常缺点办法:将受检异常转化为非受检异常

建议113:不要在finally块中处理返回值

  • 在finally块中加入了return语句会导致以下两个问题:1、覆盖了try代码块中的return返回值;2、屏蔽异常,即使throw出去了异常,异常线程会登记异常,但是当执行器执行finally代码块时,则会重新为方法赋值,也就是告诉调用者“该方法执行正确”,没有发生异常,于是乎,异常神奇的消失了

建议114:不要在构造函数中抛异常

  • Java异常机制有三种:1、Error类及其子类表示的是错误,它是不需要程序员处理的也不能处理的异常,比如VirtualMachineError虚拟机错误,ThreadDeath线程僵死等;2、RuntimeException类及其子类表示的是非受检异常,是系统可能抛出的异常,程序员可以去处理,也可以不处理,最经典的是NullPointerException空指针异常和IndexOutOfBoundsException越界异常;3、Exception类及其子类(不包含非受检异常)表示的是受检异常,这是程序员必须要处理的异常,不处理则程序不能通过编译,比如IOException表示I/O异常,SQLException数据库访问异常。一个对象的创建过程要经过内存分配、静态代码初始化、构造函数执行等过程,构造函数中是否允许抛出异常呢?从Java语法上来说,完全可以,三类异常都可以,但是从系统设计和开发的角度分析,则尽量不要在构造函数中抛出异常

建议115:使用Throwable获得栈信息

  • 在出现异常时(或主动声明一个Throwable对象时),JVM会通过fillInStackTrace方法记录下栈信息,然后生成一个Throwable对象,这样就能知道类间的调用顺序、方法名称以及当前行号等

建议116:异常只为异常服务

  • 异常原本是正常逻辑的一个补充,但有时候会被当前主逻辑使用。异常作为主逻辑有问题:1、异常判断降低了系统性能;2、降低了代码的可读性,只有详细了解valueOf方法的人才能读懂这样的代码,因为valueOf抛出的是一个非受检异常;3、隐藏了运行期可能产生的错误,catch到异常,但没有做任何处理

建议117:多使用异常,把性能问题放一边

  • new一个IOException会被String慢5倍:因为它要执行fillInStackTrace方法,要记录当前栈的快照,而String类则是直接申请一个内存创建对象。而且,异常类是不能缓存的。但是异常是主逻辑的例外逻辑,会让方法更符合实际的处理逻辑,同时使主逻辑更加清晰,可让正常代码和异常代码分离、能快速查找问题(栈信息快照)等

深入认识JVM

JVM内存分配,类加载

Java进阶(1)——JVM的内存分配 & 反射Class类的类对象 & 创建对象的几种方式 & 类加载(何时进入内存JVM)& 注解 & 反射+注解的案例

在这里插入图片描述

创建对象的4种方法总结

Java进阶(4)——结合类加载JVM的过程理解创建对象的几种方式:new,反射Class,克隆clone(拷贝),序列化反序列化

在这里插入图片描述

垃圾回收GC

在这里插入图片描述

Java进阶(垃圾回收GC)——理论篇:JVM内存模型 & 垃圾回收定位清除算法 & JVM中的垃圾回收器

简介:本篇博客介绍JVM的内存模型,对比了1.7和1.8的内存模型的变化;介绍了垃圾回收的语言发展;阐述了定位垃圾的方法,引用计数法和可达性分析发以及垃圾清除算法;然后介绍了Java中的垃圾回收器,由串行、到并行再到并发,最后到G1的演变;最后给出了垃圾回收器的对比和使用指引。

JVM调优,Arthas使用

  • Java进阶(JVM调优)——阿里云的Arthas的使用 & 安装和使用 & 死锁查找案例,重新加载案例,慢调用分析
  • Java进阶(JVM调优)——JVM调优参数 & JDK自带工具使用 & 内存溢出和死锁问题案例 & GC垃圾回收

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

认识多线程

创建多线程方法+了解线程池

Java进阶(5)——创建多线程的方法extends Thread和implements Runnable的对比 & 线程池及常用的线程池

在这里插入图片描述

多线程下-1非原子性问题即解决

Java进阶(6)——抢购问题中的数据不安全(非原子性问题)& Java中的synchronize和ReentrantLock锁使用 & 死锁及其产生的条件

在这里插入图片描述

再论线程,创建、生命周期

Java进阶(再论线程)——线程的4种创建方式 & 线程的生命周期 & 线程的3大特性 & 集合中的线程安全问题

主要内容:
1.线程创建的方式,继承Thread类,实现Runable接口,实现Callable接口,采用线程池;
2.线程生命周期: join():运行结束再下一个, yield():暂时让出cpu的使用权,deamon():守护线程,最后结束,sleep():如果有锁,不会让出;
3.线程3大特性,原子性,可见性,有序性;
4.list集合中线程安全问题,hash算法问题;


总结

程序人生——Java异常使用建议

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

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

相关文章

VMD + CEEMDAN 二次分解,CNN-Transformer预测模型

往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测(一)数据集介绍和预处理-CSDN博客 风速预测(二)基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

Data.olllo:一键数据“分组统计”!

引言: 数据统计是数据分析中的重要环节,而如何快速、准确地进行数据分组统计是许多数据工作者关注的焦点。现在,借助Data.olllo的神奇功能,您可以轻松进行一键式的数据分组统计,为您的数据分析提供更强大的支持&…

什么是浏览器指纹识别?指纹浏览器有用吗?

浏览器指纹识别是好是坏?这现在确实是一个有争议的话题。83%的消费者经常或偶尔会根据浏览历史记录看到广告。其实这就是利用了浏览器指纹技术。 如果您想了解浏览器指纹识别是什么,那就看下去! 一、什么是浏览器指纹识别 浏览器指纹是指无…

Quartz完全开发手册(一篇学会Quartz所有知识点)

目录 一、Quartz概念 1.1、Quartz介绍 1.2、使用场景 1.3、特点 二、Quartz运行环境 三、Quartz设计模式 四、Quartz学习的核心概念 4.1、任务Job 4.2、触发器Trigger 4.3、调度器Scheduler 五、Quartz的体系结构与工作流程 5.1、体系结构 5.2、工作流程 六、Quar…

【Mock|JS】Mock的get传参+获取参数信息

mockjs的get传参 前端请求 const { data } await axios("/video/childcomments", {params: {sort: 1,start: 2,count: 5,childCount: 6,commenIndex: 0,},});后端获取参数 使用正则匹配url /*** # 根据url获取query参数* param {Url} urlStr get请求获取参数 eg:…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(时间滑动选择器弹窗)

以24小时的时间区间创建时间滑动选择器,展示在弹窗上。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 本模块功能依赖UI的执行上下文,不可在UI上下文不明确的地方使用&…

vuecli创建vue3项目

第一步: 在文件夹中输入 vue create xxx 第二步: 勾选下面带有*号的,经验最好把Linter/Formatter勾掉,不然会出现eslint报错 第三步: 选择3.x 第四步: 意思为是否用history模式来创建路由&#xff0…

把 Taro 项目作为一个完整分包,Taro项目里分包的样式丢失

现象: 当我们把 Taro 项目作为原生微信小程序一个完整分包时,Taro项目里分包的样式丢失,示意图如下: 原因: 在node_modules/tarojs/plugin-indie/dist/index.js文件里,限制了只有pages目录下会被引入app.w…

The 2023 Guangdong Provincial Collegiate Programming Contest

I. Path Planning 嗯,怎么说呢,一般二维图,数据不是很大的比如n*m*log级别允许的,如果一眼不是bfs,可以考虑结合一下二分 本题可知,只能向下或者向右,那么我们就像如果答案为x,那么…

【重温设计模式】访问者模式及其Java示例

访问者模式的基本概念 访问者模式,一种行为型设计模式,其基本定义是:允许一个或者多个操作应用到一组对象上,解耦操作和对象的具体类,使得操作的添加可以独立于对象的类结构变化。在面向对象编程中,访问者…

sqllab第35-45关通关笔记

35关知识点: 宽字节注入数值型注入错误注入 payload:id1andextractvalue(1,concat(0x7e,database(),0x7e))0--联合注入 payload:id0unionselect1,database(),version()-- 36关知识点: 字符型注入宽字节注入错误注入 payload:id1%df%27andextractvalue(…

什么是浏览器指纹识别?Maskfog指纹浏览器有用吗?

浏览器指纹识别是好是坏?这现在确实是一个有争议的话题。83%的消费者经常或偶尔会根据浏览历史记录看到广告。其实这就是利用了浏览器指纹技术。 如果您想了解浏览器指纹识别是什么,那就看下去! 一、什么是浏览器指纹识别 浏览器指纹是指无…

Linux学习之自定义协议

前言: 首先对于Tcp的socket的通信,我们已经大概了解了,但是其中其实是由一个小问题,我们目前是不得而知得,在我们客户端与服务端连接成功后,服务端读取来自客户端得消息,我们使用的是函数read,…

线程池相关详解

1.线程池的核心参数 线程池核心参数主要参考ThreadPoolExecutor这个类的7个参数的构造函数: corePoolSize核心线程数目 maximumPoolSize最大线程数目(核心线程救急线程的最大数目) keepAliveTime生存时间:救急线程的生存时间,生…

Pytorch入门实战 P3-天气识别

目录 一、前期准备 1、查看设备 2、导入本地数据 3、测试下获取到的天气数据 4、图像预处理 5、划分数据集 6、加载数据集 二、搭建简单的CNN网络(特征提取分类) 三、训练模型 1、设置超参数 2、编写训练函数 3、编写测试函数 4、正式训练 …

4、类加载器

2.4.1 什么是类加载器 类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术,类加载器只参与加载过程中的字节码获取并加载到内存这一部分。 类加载器会通过二进制流的方式获取到字节码文件的内容&#xff0c…

Visual Studio配置libtorch(cuda安装一步到位)

Visual Studio配置libtorch visual Studio安装cuDNN安装CUDAToolkit安装libtorch下载Visual Studio配置libtorch(cuda版本配置) visual Studio安装 visual Studio点击安装 具体的安装和配置过程这里就不进行细讲了,可以参考我这篇博客Visual Studio配置OpenCV(保姆…

【嵌入式学习】Qtday03.21

一、思维导图 二、练习 自由发挥登录窗口的应用场景,实现一个登录窗口界面。(不要使用课堂上的图片和代码,自己发挥,有利于后面项目的完成) 要求: 1. 需要使用Ui界面文件进行界面设计 2. ui界面上的组件…

vue.js制作学习计划表案例

通俗易懂,完成“学习计划表”用于对学习计划进行管理,包括对学习计划进行添加、删除、修改等操作。 一. 初始页面效果展示 二.添加学习计划页面效果展示 三.修改学习计划完成状态的页面效果展示 四.删除学习计划 当学习计划处于“已完成”状态时&…

栈——数据结构——day4

栈的定义 栈是限定仅在一段进行插入和删除操作的线性表。 我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。 栈的插入操作,叫作进栈&#…