Java的异常Exception

异常

1、异常概述与异常体系结构

1.1、异常概述

异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”(开发过程中的语法错误和逻辑错误不是异常)

Java程序在执行过程中所发生的异常事件可分为两类:

  • Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如:StackOverFlowError和OutOfMemory。一半不编写针对性的代码进行处理。
  • Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。如:
    • 空指针访问
    • 试图图区不存在的文件
    • 网络连接中断
    • 数组角标越界

KNY_~B0DP`T5LP2X3_C7PNU.png

编译时异常:执行javac.exe命令时,可能出现的异常

运行时异常 :执行java.exe命令时,出现的异常

1.2、异常体系结构

java.lang.Throwable|-----java.lang.Error: 一半不编写针对性的代码进行处理|-----java.lang.Exception: 可以进行异常的处理|------编译时异常(checked)|-----IOException|-----FileNotFoundException|-----ClassNotFindException|------运行时异常(unchecked, RuntimeException)|-----NullPointerException|-----ArrayIndexOutOfBoundsException|-----ClassCastException|-----InputMismatchException|-----NumberFormatException|-----ArithmeticException

关于异常的举例:

见 package cs20230321.java1;

//--------以下是编译时异常----------------
//IOException
public void test7() {File file = new File("hello.txt");FileInputStream fis = new FileInputStream(file);int data = fis.read();while (data != -1){System.out.println((char) data);data = fis.read();}fis.close();//流资源需要显式的有关闭操作
}//--------以下是运行时异常----------------
//ArithmeticException
public void test6(){int a = 10;int b = 0;System.out.println(a/b);//不符合算法的要求
}//InputMismatchException
public void test5(){Scanner scanner = new Scanner(System.in);int score = scanner.nextInt();//当输入不是数字时会报异常System.out.println(score);
}//NumberFormatException
public void test4(){String str4 = "123zxc";int n4 = Integer.parseInt(str4);System.out.println(n4);
}
//ClassCastException
public void test3(){Object o= new Date();//多态String  str3 = (String) o;//转为Object的子类
}
public void test1(){//NullPointerException 1int[] arr = null;System.out.println(arr[3]);//NullPointerException 2String str = "abc";str = null;//对象是空的,所以空指针异常System.out.println(str.charAt(0));//获取首位置上的字符
}//ArrayIndexOutOfBoundsException
public void test2(){int[] arr1 = new int[10];System.out.println(arr1[10]);String str = "abc";//StringIndexOutOfBoundsExceptionSystem.out.println(str.charAt(3));//获取首位置上的字符
}

2、异常处理

联系 “ 狼来了”

异常的处理:抓抛模型

  • 过程一:“抛”:程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。并将此对象抛出。
    —旦抛出对象以后,其后的代码就不再执行。

    关于异常对象的产生:

    1. 系统自动生成的异常对象
    2. 手动的生成一个异常对象,并抛出(throw)
  • 过程二:“抓”:可以理解为异常的处理方式:① try-catch-finallythrows

2.1、try-catch-finally

格式:

try{//可能出现异常的代码}catch(异常类型1 变量名1){//处理异常的方式 1}catch(异常类型2 变量名2){//处理异常的方式 2}catch(异常类型3 变量名3){//处理异常的方式 3}...finally{//一定会执行的代码}

说明:

  1. finally是可选的

  2. 使用try将可能出现异常的代码包起来,在执行过程中,一旦出现异常,就会生成应该对应异常类的对象,根据此对象的类型,去catch中进行匹配

  3. 一旦try中的异常对象匹配到某一个cacth时,就进入catch中进行异常的处理一旦处理完成,就跳出当前的try-catch结构(在没有写finally的情况)。继续执行其后的代码

  4. catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓。

    catch中的异常类型如果有子父类关系,则要求子类一定声明在父类的上面,否则,报错

  5. 常用的异常对象处理的方式:① String getMessage() ② printStackTrace();

  6. 在try结构中声明的变量,再出了try结构以后,就不能再被调用

  7. try-catch-finally结构可以相互嵌套

体会1:使用try-catch-finally处理编译时异常,使得程序在编译时就不再报错,但是运行时仍可能报错。相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时出现。

体会2 :开发中,由于运行时异常比较常见,所以我们通常就不针对运行时异常编写try-catch-finally了。针对于编译时异常,我们说一定要考虑异常的处理。

2.1.1、finally

  1. finally是可选的
  2. finally中声明的是一定会被执行的代码。即使catch中又出现异常了,try中有return语句,catch 中有 return 语句等情况。
  3. 像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动回收的,我们需要自己手动的进行资源的释放。此时的资源释放,就需要声明在finally中。

2.1.2、面试题(待完善)

  • throw和 throws的区别?

throw 表示抛出一个异常类的对象,生成异常对象的过程。声明在方法体内。

throws属于处理异常的一种方式,声明在方法的声明处。

  • final 、finally、finalize三者的区别?

final:关键字,修饰属性、方法

finally:关键字,用于处理异常时

finalize:方法名

还有其他类似的。如:

  • Collection、 Collections
  • String、 StringBuffer、 StringBuilder
  • ArrayList、 LinkedList
  • HashMap、 LinkedHashMap
  • 重写 、重载

结构不相似的:

  • 抽象类、接口
  • ==、equals()
  • sleep() 、wait()

2.2、throws + 异常类型

  1. “throws + 异常类型 ” 写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。一旦方法体执行时,出现异常,扔会在代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码,就不再执行。

体会:

  • try-catch-finall :真正的将异常给处理调了。
  • throws的方式只是将异常抛给了方法的调用者,并没有真正将异常处理掉。

开发中,如何选择使用 try-catch-finall 还是 throws ?

  1. 如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finall 方式处理。
  2. 执行的方法 a 中,先后 又调用了另外的几个方法,这几个方法是递进关系执行的,我们建议使用throws的方式进行处理。而执行的方法 a 可以考虑使用try-catch-finall 方式进行处理。

2.3、方法重写的规则

  1. 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型

2.4、手动的生成一个有异常对象

在方法中 throw new Exception,然后再 e.getMessage() 获取message

package cs20230322;public class StudentTest {public static void main(String[] args) {try {Student s = new Student();s.regist(-1001);System.out.println(s);}catch (Exception e){System.out.println(e.getMessage());//message传的就是 "您输入的数据非法!"}}
}class Student{public int id;public void regist(int id) throws Exception {if (id > 0){this.id = id;}else {//手动生成异常//在方法内,生成一个异常对象throw new Exception("您输入的数据非法!");}}@Overridepublic String toString() {return "Student{" +"id=" + id +'}';}
}

2.5、如何自定义异常类?

步骤:

  1. 继承于现有的异常结构:RuntimeException、Exception
  2. 提供全局常量:serialVersionUID
  3. 提供重载的构造器

2.6、总结

1679477597470.png

上游排污:污:异常,是throw排出来的污水(制造污水)

下游治污:处理异常,处理的方案是直接往上面报,并没有真正的处理掉异常(治理污水)

image.png

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

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

相关文章

MachineLearningWu_7+8_LogisticRegression/Classification

x.1 logistic regression 对于诸如分辨细胞是恶性肿瘤细胞与否的类似分类问题,我们使用Linear Regression的模型并不合适,所以引入Logistic Regression的模型,并绘制decision boundary,如下, Classification的最后一层…

基于Java+Swing+Mysql实现图书管理系统V2.0

基于JavaSwingMysql实现图书管理系统V2.0 一、系统介绍二、功能展示1.项目内容2.项目骨架3.数据库表4.主界面5.添加6、修改7、查询8、删除 四、其它1.其他系统实现五.获取源码 一、系统介绍 本系统主要有对图书信息的增删改查操作功能。 项目类型:Java SE项目&…

多元分类预测 | Matlab 粒子群算法(PSO)优化xgboost的分类预测,多输入单输出模型。PSO-xgboost分类预测模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab 粒子群算法(PSO)优化xgboost的分类预测,多输入单输出模型。PSO-xgboost分类预测模型 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程…

软考高级之系统架构师系列之系统配置与性能评价、信息化基础

系统配置与性能评价 性能 计算机系统的性能一般包括两个大的方面: 可用性,也就是计算机系统能正常工作的时间,其指标可以是能够持续工作的时间长度,也可以是在一段时间内,能正常工作的时间所占的百分比处理能力&…

网页版代码编辑器实现

接着前几天写的博客https://blog.csdn.net/woyebuzhidao321/article/details/131495855,提到了涉及vscode网页版工作区创建的api,这两天一时兴起,搞了一个网页版的代码编辑器,如果在2020年10月之前,实现一个网页版代码…

【Java语法小记】求字符串中某个字符的数量——IntStream流的使用

文章目录 引入需求代码原理解读s.chars()IntStream filter​(IntPredicate predicate)long count()补充:IntStream peek​(IntConsumer action) 流操作和管道 引入需求 从一段代码引入 return s.length() - (int) s.chars().filter(c -> c S).count(); 其中 (…

cmake流程控制---cmake数学计算操作和if命令

目录 cmake 数学计算操作 demo if命令 基本表达式 逻辑表达式(NOT AND OR) 比较表达式 正则表达式 demo 文件系统相关 判断是否存在的表达式 cmake 数学计算操作 有时候我们需要对cmake变量之间进行数学运算,这时候cmake提供了math()这个命令,命令格式如下: math(…

SQL-每日一题【584.寻找用户推荐人】

题目 给定表 customer ,里面保存了所有客户信息和他们的推荐人。 写一个查询语句,返回一个客户列表,列表中客户的推荐人的编号都 不是 2。 对于上面的示例数据,结果为: 解题思路 1.题目要求查询列表中客户的推荐人的…

RTL8309M实现VLAN功能-驱动编进内核

部分硬件实现图 一、使内核支持802.1Q功能 1、使用内核kernel版本4.19.232 2、make menuconfig 配置内核 3、进入Networking support 4、进入Networking options 5、把这些都编进内核 6、点击保存退出 CONFIG_GARPy CONFIG_MRPy CONFIG_BRIDGE_VLAN_FILTERINGy CONFIG_VLAN…

Go语言程序设计(五)切片

一、切片的定义 在Go语言中,切片(Slice)是数组的一个引用,它会生成一个指向数组的指针,并通过切片长度关联到底层数组部分或者全部元素。切片还提供了一系列对数组的管理功能(append、copy),可以随时动态扩充存储空间,并且可以被随意传递而不会导致所管理…

C++数据结构笔记(7)——队列的顺序结构实现

1.队列&#xff0c;和现实生活中的规则类似&#xff0c;先进先出 2.队尾只允许元素进入&#xff0c;队头只允许元素退出 3.用数组来实现队列的顺序存储&#xff0c;无论哪一段都可以作为队头或者队尾 SeqQueue.h头文件 #ifndef SEQQUEUE_H #define SEQQUEUE_H #include<…

Linux——进程信号详解

目录 一.进程信号的理解 1.1定义&#xff1a; 1.2举例&#xff1a; 1.3总结&#xff1a; 二.进程信号地使用&#xff1a; 2.1信号种类&#xff1a; 2.2而操作系统向进程发送信号地方式有四种&#xff1a; 2.2.1以键盘的方式向进程发送信号 接下来介绍一个系统调用函数sign…