Day09

1.异常

1.1 介绍

在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式问题,读取文件是否存在,网络是否始终保持通畅等等。
异常 :指的是程序在执行过程中,出现的非正常情况,如果不处理最终会导致 JVM 的非正常停止。

1.2 异常的抛出机制

Java 中把不同的异常用不同的类表示,一旦发生某种异常,就创建该异常类型的对象,并且抛出(throw)。然后程序员可以捕获(catch)到这个异常对象,并处理;如果没有捕获(catch)这个异常对象,那么这个异常对象将会导致程序终止。

1.3 Throwable类

Throwable类是Java程序执行过程中发生的异常事件对应的类的根父类。Throwable 中的常用方法:

  1. public void printStackTrace():打印异常的详细信息。包含了异常的类型、异常的原因、异常出现的位置、在开发和调试阶段都得使用printStackTrace。
  2. public String getMessage():获取发生异常的原因。

1.3.1 Error 和 Exception

Throwable 可分为两类:Error 和 Exception。分别对应着 java.lang.Error 与java.lang.Exception 两个类。

  1. Error:Java 虚拟机无法解决的严重问题。如:JVM 系统内部错误、资源耗尽等严重情况。一般不编写针对性的代码进行处理。例如:StackOverflowError(栈内存溢出)和 OutOfMemoryError(堆内存溢出,简称OOM)。
  2. Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,需要使用针对性的代码进行处理,使程序继续运行。否则一旦发生异常,程序也会挂掉。例如:
  • 空指针访问
  • 试图读取不存在的文件
  • 网络连接中断
  • 数组角标越界

1.3.2 编译时异常和运行时异常

  1. 编译时期异常(即 checked 异常、受检异常):在代码编译阶段,编译器就能明确警示当前代码可能发生(不是一定发生)xx 异常,并明确督促程序员提前编写处理它的代码。如果程序员没有编写对应的异常处理代码,则编译器就会直接判定编译失败,从而不能生成字节码文件。通常,这类异常的发生不是由程序员的代码引起的,或者不是靠加简单判断就可以避免的,例如FileNotFoundException(文件找不到异常)。
  2. 运行时期异常(即 runtime 异常、unchecked 异常、非受检异常):在代码编译阶段,编译器完全不做任何检查,无论该异常是否会发生,编译器都不给出任何提示。只有等代码运行起来并确实发生了 xx 异常,它才能被发现。通常,这类异常是由程序员的代码编写不当引起的,只要稍加判断,或者细心检查就可以避免。
  • java.lang.RuntimeException:类及它的子类都是运行时异常。比如:ArrayIndexOutOfBoundsException:数组下标越界异常,ClassCastException类型转换异常。

1.3.3 常见的运行时异常

  1. NullPointerException
  2. ClassCastException
  3. ArrayIndexOutOfBoundsException
  4. NumberFormatException
  5. InputMismatchException
  6. ArithmeticException
//NullPointerException
int[][] arr = new int[3][];
System.out.println(arr[0].length);
}
@Test
public void test02(){
//ClassCastException
Object obj = 15;
String str = (String) obj;
}
@Test
public void test03(){
//ArrayIndexOutOfBoundsException
int[] arr = new int[5];
for (int i = 1; i <= 5; i++) {
System.out.println(arr[i]);
}
}
@Test
public void test04(){
//InputMismatchException
Scanner input = new Scanner(System.in);
System.out.print("请输入一个整数:");//输入非整数
int num = input.nextInt();
input.close();
}
@Test
public void test05(){
int a = 1;
int b = 0;
//ArithmeticException
System.out.println(a/b);
}
}

1.3.4 常见的编译时异常

  1. InterruptedException
  2. ClassNotFoundException
  3. SQLException
@Testpublic void test06() {Thread.sleep(1000);//休眠 1 秒 InterruptedException}@Testpublic void test07(){Class c = Class.forName("java.lang.String");//ClassNotFoundException}@Testpublic void test08() {Connection conn = DriverManager.getConnection("...."); //SQL
Exception}@Testpublic void test09() {FileInputStream fis = new FileInputStream("尚硅谷 Java 秘籍.txt
"); //FileNotFoundException}@Testpublic void test10() {File file = new File("尚硅谷 Java 秘籍.txt");
FileInputStream fis = new FileInputStream(file);//FileNotFound
Exception
int b = fis.read();//IOException
while(b != -1){
System.out.print((char)b);
b = fis.read();//IOException
}
fis.close();//IOException}

1.4 异常的处理

Java 采用的异常处理机制,是将异常处理的程序代码集中在一起,与正常的程序代码分开,使得程序简洁、优雅,并易于维护。

1.4.1 try-catch-finally

Java 提供了异常处理的抓抛模型。

  1. 前面提到,Java 程序的执行过程中如出现异常,会生成一个异常类对象,该异常对象将被提交给 Java 运行时系统,这个过程称为抛出(throw)异常。
  2. 如果一个方法内抛出异常,该异常对象会被抛给调用者方法中处理。如果异常没有在调用者方法中处理,它继续被抛给这个调用方法的上层方法。这个过程将一直继续下去,直到异常被处理。这一过程称为捕获(catch)异常。
  3. 如果一个异常回到 main()方法,并且 main()也不处理,则程序运行终止。
try{
...... //可能产生异常的代码
}
catch( 异常类型 1 e ){
...... //当产生异常类型 1 型异常时的处置措施
}
catch( 异常类型 2 e ){
...... //当产生异常类型 2 型异常时的处置措施
} 
finally{
...... //无论是否发生异常,都无条件执行的语句
}
  1. 将可能出现异常的代码声明在try语句中。一旦代码发生异常,就会自动生成一个对应异常类的对象,并将此对象抛出。
  2. 针对于try中抛出的异常类的对象,使用之后的catch语句进行匹配。一旦匹配上,就进入catch语句块进行处理。当处理结束之后,代码就可以继续向下执行。
  3. 如果声明了多个catch结构,不同的异常类型在不存在子父类关系的情况下,谁声明在上面,谁声明在下面都可以。
  4. 如果多个异常类型满足子父类的关系,则必须将子类声明在父类结构的上面,否则会报错。
  5. catch中异常处理的方式:
  • 编写异常处理的语句。
  • printStackTrace():打印异常的详细信息。(推荐)
  • getMessage():获取发生异常的原因。
  1. try中声明的变量,由于作用域限制,在try结构之外不可以进行调用。
  2. 将一定要被执行的代码声明在finally结构中。 唯一的例外是使用System.exit(0)来终止当前正在运行的Java虚拟机。
  3. finally语句和catch语句是可选的,但finally不能单独使用。
  4. 在开发中,有一些资源(比如:输入流、输出流、数据库连接、Socket连接等资源)在使用完以后。必须显式的进行关闭操作,否则,GC不会自动的回收这些资源。进而导致内存的泄露。为了保证这些资源在使用完以后,不管是否出现了未被处理的异常的情况下,这些资源能被关闭。我们必须将这些操作声明在finally中!

1.4.2 throws + 异常类型

  1. 在方法的声明处,使用"throws 异常类型1,异常类型2,…"。
public void test() throws 异常类型1,异常类型2,...{//可能存在编译时异常
}
  1. 从编译是否能通过的角度看,看成是给出了异常万一要是出现时候的解决方案。此方案就是,继续向上抛出(throws)。但是,此throws的方式,仅是将可能出现的异常抛给了此方法的调用者。此调用者仍然需要考虑如何处理相关异常。从这个角度来看,throws的方式不算是真正意义上处理了异常。
  2. 方法重写的要求:子类重写的方法抛出的异常类型可以与父类被重写的方法抛出的异常类型相同,或是父类被重写的方法抛出的异常类型的子类。

1.4.3 开发中如何选择异常处理的方式

  1. 如果程序代码中,涉及到资源的调用(流、数据库连接、网络连接等),则必须考虑使用 try-catch-finally 来处理,保证不出现内存泄漏。
  2. 如果父类被重写的方法没有 throws 异常类型,则子类重写的方法中如果出现异常,只能考虑使用 try-catch-finally 进行处理,不能 throws。
  3. 开发中,方法 a 中依次调用了方法 b,c,d 等方法,方法 b,c,d 之间是递进关系。此时,如果方法 b,c,d 中有异常,我们通常选择使用 throws,而方法 a 中通常选择使用 try-catch-finally。

1.5 throw手动抛出异常对象

1.5.1 原因

在实际开发中,如果出现不满足具体场景的代码问题,我们就有必要手动抛出一个指定类型的异常对象。

1.5.2 介绍

  1. 程序在执行的过程当中,不满足指定条件的情况下,我们主动的使用"throw +异常类的对象"方式抛出异常对象。
  2. throw new 异常类名(参数);
  3. throw后的代码不能被执行,编译不通过。

1.6 自定义异常类

1.6.1 原因

Java 中不同的异常类,分别表示着某一种具体的异常情况。那么在开发中总是有些异常情况是核心类库中没有定义好的,此时我们需要根据自己业务的异常情况来定义异常类。例如年龄负数问题,考试成绩负数问题,某员工已在团队中等。

1.6.2 如何自定义异常类

  1. 继承于现有的异常体系,通常继承于Runtime Exception\Exception。
  2. 通常提供几个重载的构造器。
  3. 提供一个全局变量,声明为:static final long serialVersionUID。

1.6.3 使用自定义异常类

  1. 在具体的代码中,满足指定条件的情况下,需要手动的使用"throw +自定义异常类的对象"方式,将异常对象抛出。
  2. 如果自定义异常类是非运行时异常,则必须考虑如何处理此异常类的对象。(具体的:① try-catch-finally ② throws)

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

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

相关文章

【分布式系统学习】CAP原理详解

CAP原理详解 前言CAP一张图 一、概念1.1 关键词解读1.2 关于CAP&#xff08;拆分解读&#xff09;1.3 CAP原理精髓 二、CAP模拟场景举例理解三、CAP原理证明为什么不能同时满足&#xff08;下面举例说明&#xff09;3.1 必须满足分区容错性P下的处理方式3.2 不是必须满足分区容…

​LeetCode解法汇总2336. 无限集中的最小数字

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 现有一个包…

PlantUML语法(全)及使用教程-类图

目录 1. 类图1.1、什么是类图1.2、元素声明1.3、类之间的关系1.4、关系上的标签1.5、在元素名称和关系标签中使用非字母1.6、添加方法 1. 类图 类图的设计语法与编程语言的传统语法相似。这种相似性为开发人员提供了一个熟悉的环境&#xff0c;从而使创建图表的过程更简单、更直…

Golang中rune和Byte,字符和字符串有什么不一样

Rune和Byte&#xff0c;字符和字符串有什么不一样 String Go语言中&#xff0c; string 就是只读的采用 utf8 编码的字节切片(slice) 因此用 len 函数获取到的长度并不是字符个数&#xff0c;而是字节个数。 for循环遍历输出的也是各个字节。 Rune rune 是 int32 …

[数据结构]-map和set

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、键值对…

centos系列:【 全网最详细的安装配置Nginx,亲测可用,解决各种报错】

全网最详细的安装配置Nginx&#xff0c;亲测可用&#xff0c;解决各种报错 全网最详细的安装配置Nginx1、 安装环境依赖2、 下载Nginx包3、编译Nginx4、安装Nginx5、启动Nginx6、配置Nginx7、了解Nginx服务的主配置文件 nginx.conf8、基于授权的访问控制9、基于IP和端口的访问控…

软件设计师——法律法规(一)

&#x1f4d1;前言 本文主要是【法律法规】——软件设计师法律法规的题目&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日…

Day 1 Two Sum

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

《opencv实用探索·四》Mat图像数据类型转换和归一化显示

一种数据类型转为另一种数据类型&#xff0c;不改变图像大小&#xff0c;但每个像素值可能会变 src.convertTo(dst, type, scale, shift);Scale和shitf默认为0&#xff08;这两个参数也相当于对比度和亮度&#xff09; 现在有个8位图像&#xff0c;把8位转成32位 可以看到像素…

SparkRDD及算子-python版

RDD相关知识 RDD介绍 RDD 是Spark的核心抽象&#xff0c;即 弹性分布式数据集&#xff08;residenta distributed dataset&#xff09;。代表一个不可变&#xff0c;可分区&#xff0c;里面元素可并行计算的集合。其具有数据流模型的特点&#xff1a;自动容错&#xff0c;位置…

jetson如何安装onnxsim,Failed to build onnxsim或者是no module named ‘onnxsim‘

Failed to build onnxsim或者是no module named ‘onnxsim’ 方法&#xff1a;直接pip3 install onnxsim 这里需要注意你的cmake版本&#xff0c;旧版本1.18.3不行&#xff0c;我将cmake升级为3.27.5就可以&#xff0c;直接pip3 install cmake 3.27.5 安装onnxsim失败的原因就…

【目标跟踪】光流跟踪(python、c++代码)

文章目录 前言一、代码流程与思路二、python 代码2.1 代码详解2.2 完整代码 三、c 代码四、结果展示 前言 光流利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系&#xff0c;从而计算出相邻帧之间物体的运动信息的一种方法。…

WPF制作雷达扫描效果

前言 要实现该功能,我们就不得不先了解一下WPF里面的RenderTransform RenderTransform(渲染变换) <Border Height="100" Width="100" Background="Red"

ESP32:物联网时代的神器

随着物联网技术的不断发展&#xff0c;人们的生活正在发生着翻天覆地的变化。在这个万物互联的时代&#xff0c;ESP32作为一种功能强大的微控制器&#xff0c;正发挥着越来越重要的作用。本文将介绍ESP32的特点和应用&#xff0c;并探讨其在物联网时代的优势和潜力。 一、ESP3…

ModBus电表与RS485电表有哪些区别?

在能源计量领域&#xff0c;ModBus电表和RS485电表是两种常见的设备&#xff0c;它们都具有监测和记录电能数据的功能。然而&#xff0c;它们之间存在一些区别&#xff0c;比如通信协议、连接方式、数据格式等等参数的区别有哪些&#xff1f; ModBus电表和RS485电表都是用于电能…

FreeSWITCH学习笔记:EventSocket

Event Socket命令最后需带有两个换行符。 api 执行API命令。阻塞。 1api API [ARG [ ...]] auth 内连模式下身份验证。需要第一个发送。 1auth PASSWORD bgapi 后台执行API命令。不阻塞。 1bgapi API [ARG [ ...]]2[Job-UUID: UUID] 返回带有Job-UUID。当API命令执行完成…

GPT-4惨遭削弱,偷懒摸鱼绝不多写一行代码,OpenAI已介入调查

GPT-4再次遭网友“群攻”&#xff0c;原因是“懒”得离谱! 有网友想在Android系统开发一个能够与OpenAI API实时交互的应用。 于是把方法示例链接发给GPT-4&#xff0c;让它参考用Kotlin语言编写代码: 没成想&#xff0c;和GPT-4一来二去沟通半天&#xff0c;GPT-4死活给不出…

数字孪生智慧园区:企业与政府合作的共赢之选

随着科技的快速发展和数字化转型的推动&#xff0c;数字孪生技术正逐渐成为智慧城市和园区建设的重要方向。数字孪生智慧园区&#xff0c;以数字孪生技术为驱动&#xff0c;通过对园区实体和虚拟环境的全面感知和深度理解&#xff0c;为园区管理者和入驻企业提供智能化决策支持…

微信发红包,有哪些测试点

1、功能 1.在红包钱数&#xff0c;和红包个数的输入框中只能输入数字 2.红包里最多和最少可以输入的钱数 200 0.01 3.拼手气红包最多可以发多少个红包 100 3.1超过最大拼手气红包的个数是否有提醒 4.当红包钱数超过最大范围是不是有对应的提示 5.当发送的红包个数超过…

YOLOv5改进之ShuffleNetV2

目录 一、原理 网络结构 二、代码 三、应用到YOLOv5 一、原理