异常的顶级理解

目录

1.异常的概念与体系结构

 1.1异常的体系结构

1.2异常的举例

1.3错误的举例

 2.异常的分类

2.1编译时异常

 2.2运行时异常

3.异常的处理

3.1异常的抛出throw

3.2try-catch捕获并处理

3.3finally

3.4 异常声明throws

4.自定义异常类


1.异常的概念与体系结构

 1.1异常的体系结构

异常种类繁多,为了对不同异常或者错误进行很好的分类管理, Java 内部维护了一个异常的体系结构:

  从上图中可以看到:

1. Throwable 是异常体系的顶层类,其派生出两个重要的子类 , Error Exception
2. Error 指的是 Java 虚拟机无法解决的严重问题,比如: JVM 的内部错误、资源耗尽等 ,典型代表: StackOverflflowError OutOfMemoryError ,一旦发生回力乏术。
3. Exception 异常产生后程序员可以通过代码进行处理,使程序继续执行。比如:感冒、发烧。我们平时所说 的异常就是Exception

 

1.2异常的举例

Java 中,将程序执行过程中发生的不正常行为称为异常
比如:
(1)算术异常
 public static void main(String[] args) {System.out.println(10/0);}

运行结果及分析:

补充:

 

 (2)数组越界异常

public static void main(String[] args) {int[] arr = {1, 2, 3,4,5};System.out.println(arr[10]);}
// 执行结果
Exception in thread "main" java . lang . ArrayIndexOutOfBoundsException : 100
(3)空指针异常
public static void main(String[] args) {int[] arr = null;System.out.println(arr.length);}
// 执行结果
Exception in thread "main" java . lang . NullPointerException

1.3错误的举例

StackOverflflowError

public class Text2 {public static void fun(){fun();}public static void main(String[] args) {fun();}
}

执行结果:


 2.异常的分类

异常可能在编译时发生,也可能在程序运行时发生,根据发生的时机不同,可以将异常分为:

2.1编译时异常

在程序编译期间发生的异常,称为编译时异常,也称为受检查异常 (Checked Exception)
举个经典的例子:

理解: 

正确完整代码:

public class Text3 {public static void main(String[] args) throws CloneNotSupportedException {Person p1 = new Person(18, "WH");Person p2= (Person) p1.clone();}
}
public class Person {int age;String nume;public Person(int age, String nume) {this.age = age;this.nume = nume;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}

 2.2运行时异常

在程序执行期间发生的异常,称为运行时异常,也称为非受检查异常 (Unchecked Exception)
RunTimeException 以及其子类对应的异常,都称为运行时异常
比如:
NullPointerException 、 ArrayIndexOutOfBoundsException、 ArithmeticException
在1.2异常的举例中展示了相关代码
注意:编译时出现的语法性错误,不能称之为异常。
例如将 System.out.println 拼写错了 , 写成了 system.out.println. 此时编译过程中就会出错 , 这是 " 编译期 " 出错。
而运行时指的是程序已经编译通过得到 class 文件了 , 再由 JVM 执行过程中出现的错误 .

 


3.异常的处理

在Java中,异常处理主要的5个关键字:try、catch、final、throw、throws。

异常的捕获,也就是异常的具体处理方式,主要有两种:异常声明throws 以及 try-catch捕获处理。

3.1异常的抛出throw

在编写程序时,如果程序中出现错误,此时就需要将错误的信息告知给调用者
在Java中,可以借助throw关键字,抛出一个指定的异常对象,将错误信息告知给调用者
语法:
throw new XXXException ( " 异常产生的原因 " )
主动抛出指定异常

运行结果:

Exception in thread "main" java.lang.NullPointerException: hahaha

注意事项
(1) throw 必须写在方法体内部
(2)抛出的对象必须是 Exception 或者 Exception 的子类对象
(3) 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处                 理, 直接交给JVM来处理
(4)如果抛出的是编译时异常,用户必须处理,否则无法通过编译
(5)异常一旦抛出,其后的代码就不会执行

对于(3)(5)举例:

3.2try-catch捕获并处理

语法形式:

如果真正要对异常进行 处理,就需要try-catch
注意事项
(1) try块内抛出异常位置之后的代码将不会被执行
public static void main(String[] args) {try{System.out.println(10/0);System.out.println(100);}catch (ArithmeticException e){e.printStackTrace();}}

运行结果:

java.lang.ArithmeticException: / by zero

(2)如果抛出异常类型与catch时异常类型不匹配,即异常不会被成功捕获,也就不会被处理,继续往外抛,直到 JVM收到后中断程序----异常是按照类型来捕获的

public static void main(String[] args) {try {System.out.println(10/0);} catch (NullPointerException e) {System.out.println(10);}}

运行结果:

Exception in thread "main" java.lang.ArithmeticException: / by zero

没有打印10,而是报java.lang.ArithmeticException: / by zero,
因为:异常没有被成功捕获,也就不会被处理继续往外抛,直到 JVM收到后中断程序
(3)try中可能会抛出多个不同的异常对象,则必须用多个catch来捕获----即多种异常,多次捕获

 

(4)如果异常之间具有父子关系,一定是子类异常在前catch,父类异常在后catch,否则语法错误

(5)可以通过一个catch捕获所有的异常,即多个异常,一次捕获(不推荐)

Exception 类是所有异常类的父类. 因此可以用这个类型表示捕捉所有异常

3.3finally

在写程序时, 有些特定的代码,不论程序是否发生异常,都需要执行,比如程序中打开的资源 :网络连接、数据库 连接、IO 流等, 在程序正常或者异常退出时,必须要对资源进进行回收 。另外,因为 异常会引发程序的跳转,可能 导致有些语句执行不到 finally 就是用来解决这个问题的。
小结: finally 中的代码一定会执行的,一般在 finally 中进行一些资源清理的扫尾工作
注意:
finally 执行的时机是在方法返回之前 (try 或者 catch 中如果有 return 会在这个 return 之前执行 fifinally). 但是如果 finally 中也存在 return 语句 , 那么就会执行 fifinally 中的 return, 从而不会执行到 try 中原有的 return.
一般我们不建议在 finally 中写 return ( 被编译器当做一个警告 )

 

3.4 异常声明throws

处在方法声明时参数列表之后,当方法中抛出编译时异常,用户不想处理该异常,此时就可以借助 throws 将异常抛 给方法的调用者来处理。即当前方法不处理异常,提醒方法的调用者处理异常

 

语法格式:

修饰符 返回值类型 方法名 ( 参数列表 ) throws 异常类型 1 ,异常类型 2 ...{
}

  注意:

如果方法是main方法调用者仍然可以不处理异常,借助throws将异常抛 给JVM来处理。

注意事项
1. throws 必须跟在方法的参数列表之后
2. 声明的异常必须是 Exception 或者 Exception 的子类
3. 方法内部如果抛出了多个异常, throws 之后必须跟多个异常类型,之间用逗号隔开,如果抛出多个异常类型 具有父子关系,直接声明父类即可。
4.我们在使用throws时,要明确声明的异常是编译时异常还是运行时异常。

比如:

(1)

(2) 

 

如果是 运行时异常调用者不处理异常也没关系,JVM会处理。

如果是编译时异常一定要处理异常

处理方式:(1)try-catch捕获并处理

                  (2)借助throws将异常抛 给JVM来处理。



4.自定义异常类

Java 中虽然已经内置了丰富的异常类 , 但是并不能完全表示实际开发中所遇到的一些异常,此时就需要维护符合我 们实际情况的异常结构.
如何自定义异常类?
例题:

定义Course类,Course包含private String cno,private String cname,private int credit,Course包括方法:public Course(),public Course。Define CreditException类扩展(继承) 在RunTimeException中,CreditException包含以下方法:public CreditException()、public CreditException(String Message)。

如果课程的学分低于0.5或高于6,则课程的构建方法将抛出CreditException,消息为“学分应在0.5和6之间!”。

定义公共类TestCourse,创建一个Course对象,并使用try/catch块来处理CreditException。

代码:
import java.util.Scanner;public class LogIn {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);System.out.println("请输入cno");String cno=scanner.next();System.out.println("请输入课程名字");String cname=scanner.next();System.out.println("请输入学分");double credit=scanner.nextDouble();Course course=new Course(cno,cname,credit);try {if(!(course.getCredit()>=0.5&&course.getCredit()<=6)){throw new CreditException("课程的学分应在0.5到6之间");}else{System.out.println("输入成功学分为:"+course.getCredit());}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
class Course{private String cno;private String cname;private double credit;public Course(String cno, String cname, double credit) {this.cno = cno;this.cname = cname;this.credit = credit;}public Course() {}public String getCno() {return cno;}public void setCno(String cno) {this.cno = cno;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public double getCredit() {return credit;}public void setCredit(double credit) {this.credit = credit;}}
class CreditException extends RuntimeException{public CreditException(String message){super(message);}
}

注意事项

  • 自定义异常通常会继承自 Exception 或者 RuntimeException
  • 继承自 Exception 的异常默认是受查异常
  • 继承自 RuntimeException 的异常默认是非受查异常

以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

 

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

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

相关文章

华为三层交换机与路由器对接上网

华为三层交换机与路由器对接上网

Win7旗舰版64位桌面创建32位IE方法

很多Win7 64位旗舰版用户系统桌面上的IE8浏览器&#xff0c;打开后都是64位的&#xff0c;而很多网站并不兼容64位的IE浏览器&#xff0c;其实在Win764位系统中IE是分为64位和32位的&#xff0c;出现这样的情况可能是桌面上的IE图标指响的是64位的IE&#xff0c;我们只要重新添…

Ae 效果:CC Cross Blur

模糊和锐化/CC Cross Blur Blur & Sharpen/CC Cross Blur CC Cross Blur&#xff08;CC 交叉模糊&#xff09;可以通过单独控制水平和垂直方向的模糊程度来创建独特的交叉模糊效果&#xff0c;可以产生类似光线交错的视觉外观。 ◆ ◆ ◆ 效果属性说明 Radius X 半径 X 用…

win10系统启用win32长路径

Step1、在系统开始 输入框中输入: gpedit.msc&#xff0c;然后回车键。 Step2、在本地计算机 策略中&#xff0c;选择: 计算机配置 -> 管理模板 Step3、然后选择: 系统 -> 文件系统 Step4、窗口中上靠右侧有 启用Win32长路径&#xff0c;如下图: Step5、双击 启用Win…

【免费模板】2023数学建模国赛word+latex模板免费分享

无需转发 免费获取2023国赛模板&#xff0c;获取方式见文末 模板文件预览如下&#xff1a; 模板参考格式如下&#xff1a; &#xff08;题目&#xff09;XXXXXX 摘 要&#xff1a; 开头段&#xff1a;需要充分概括论文内容&#xff0c;一般两到三句话即可&#xff0c;长度控…

Kubernetes之舞:微服务的交响乐团

Kubernetes与微服务&#xff1a;缘起 微服务的崛起 微服务架构已经成为现代软件开发的标准。与传统的单体应用相比&#xff0c;微服务提供了更高的模块化&#xff0c;使得团队可以独立地开发、部署和扩展各个服务。这种架构模式的主要优势在于其灵活性和可扩展性&#xff0c;允…

【牛客刷题】bfs和dfs (二叉树层序遍历、矩阵最长递增路径、被围绕的区域)

二叉树层序遍历 vector<vector<int> > levelOrder(TreeNode* root) {// write code herevector<int> res;vector<vector<int>> result;if (root nullptr) return result;queue<TreeNode*> que;que.push(root);while (!que.empty()) {int …

gitLab(git)误提交命令

1.先使用下面命令查看一下分支上已提交的信息 git log 2.回退到之前的版本 git reset —hard 你要删除的提交哈希码&#xff08;一般是离这个命令最近的一串数字&#xff09; 3.覆盖掉远端的版本信息&#xff0c;使远端的仓库也回退到相应的版本 注意&#xff1a;切换到你提…

jmeter系列-测试计划详细介绍(3)

测试计划的作用 测试计划描述了 Jmeter 在执行时&#xff0c;一系列的步骤一个完整的测试计划包含了一个或多个【线程组、逻辑控制器、采样器、监听器、定时器、断言和配置元素】 Jmeter原件和组件的介绍 基本元件的介绍 多个类似功能组件的 容器&#xff08;类似于类&…

PCL 计算两异面直线公垂线垂足位置

目录 一、算法原理1、推导过程2、参考文献3、主要函数4、算法源码二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、算法原理 1、推导过程 设置直线

PYTHON链家租房数据分析:岭回归、LASSO、随机森林、XGBOOST、KERAS神经网络、KMEANS聚类、地理可视化...

全文下载链接:http://tecdat.cn/?p29480 作者&#xff1a;Xingsheng Yang 1 利用 python 爬取链家网公开的租房数据&#xff1b; 2 对租房信息进行分析&#xff0c;主要对房租相关特征进行分析&#xff0c;并搭建模型用于预测房租&#xff08;点击文末“阅读原文”获取完整代码…

UI基础——UGUI源码架构

文章目录 如何阅读源码UGUI源码整体架构源码整体类图事件模块EventSystem类图点击事件时序图 参考&#xff1a; 如何阅读源码 阅读源码是提高编程能力和技术水平的重要途径之一。以下是一些有效的阅读源码的方法&#xff1a; 确定目标&#xff1a;&#xff08;1&#xff09;了…