Java异常处理(2)--异常处理机制及自定义异常

在编写程序时,经常要在可能出现错误的地方加上检测的代码,如进行x/y运算时,要检测分母为0,数据为空,输入的不是数据而是字符等。过多的if-else分支会导致程序的代码加长、臃肿,可读性差。因此采用异常处理机制。

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


Java提供的是异常处理的抓抛模型。
在这里插入图片描述

Java程序的执行过程中如出现异常,会生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。

异常对象的生成抛出:
①由虚拟机自动生成:程序运行过程中,虚拟机检测到程序发生了问题,如果在当
前代码中没有找到相应的处理程序,就会在后台自动创建一个对应异常类的实例
对象并抛出——自动抛出
②由开发人员手动创建:Exception exception = new ClassCastException();——创
建好的异常对象不抛出对程序没有任何影响,和创建一个普通对象一样
在这里插入图片描述
如果一个方法内抛出异常,该异常对象会被抛给调用者方法中处理。如果异常没有在调用者方法中处理,它继续被抛给这个调用方法的上层方法。这个过程将一直继续下去,直到异常被处理。这一过程称为捕获(catch)异常。如果一个异常回main()方法,并且main()也不处理,则程序运行终止。


Java异常处理的方式

方式一:try-catch-finally
方式二:throws + 异常类型


通过try-catch-finally(finally可选)方式

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

如果明确知道产生的是何种异常,可以用该异常类作为catch的参数;也可以用其父类作为catch的参数。比 如 : 可 以 用 ArithmeticException 类 作 为 参 数 的 地 方 , 就 可 以 用RuntimeException类作为参数,或者用所有异常的父类Exception类作为参数。但不能是与ArithmeticException类无关的异常。NullPointerException(catch中的语句将不会执行)。

使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常, 就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配。一旦try中的异常对象匹配到某一个catch时, 就进入catch中进行异常的处理。处理完成,就跳出当前的try-catch结构(在没有写finally的情况)。继续执行其后的代码。

catch中的异常类型如果没有子父类关系,则谁声明在上,谁声明在下无所谓。
catch中的异常类型如果存在子父类关系,则要求子类一定声明在父类的上面,否则会报错。

异常对象处理(一般写在catch语句里面,如e.printStackTrace()):
①返回String的getMessage() ,获取异常信息。
②没有返回值的printStackTrace(),获取异常类名和异常信息,以及异常出现在程序中的位置。

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

try-catch-finally结构可以嵌套。

使用try-catch-finally处理编译时异常,是得程序在编译时就不再报错,但是运行时仍可能报错。相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时出现。
开发中,由于运行时异常比较常见,所以我们通常不针对运行时异常编写try-catch-finally。而针对于编译时异常,一定要考虑异常的处理。


通过throws方式

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

public void readFile(String file) throws FileNotFoundException {......// 读文件的操作可能产生FileNotFoundException类型的异常FileInputStream fis = new FileInputStream(file);......
}

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

重写方法不能抛出比被重写方法范围更大的异常类型。在多态的情况下,对methodA()方法的调用-异常的捕获按父类声明的异常处理。

public class A {public void methodA() throws IOException {......}
}
public class B1 extends A {public void methodA() throws FileNotFoundException {......}
}
public class B2 extends A {public void methodA() throws Exception { //报错......}
}

如果父类中被重写的方法没有throws方式处理异常,则子类重写的方法也不能使用throws,意味着如果子类重写的方法中有异常,必须使用try-catch-finally方式处理。


手动抛出(生成创建)异常(throw)

Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要使用人工创建并抛出。

首先要生成异常类对象,然后通过throw语句实现抛出操作(提交给Java运行环境)。例如:

IOException e = new IOException();
throw e;

或者直接

throw new IOException();

用户自定义异常类

一般地,用户自定义异常类都是RuntimeException的子类。
自定义异常类必须继承现有的异常类。
自定义异常类通常需要编写几个重载的构造器。
自定义异常需要提供serialVersionUID。
自定义的异常通过throw抛出。

例子

class MyException extends Exception {static final long serialVersionUID = 13465653435L;private int idnumber;public MyException(String message, int id) {super(message);this.idnumber = id;}public int getId() {return idnumber;}
}
public class MyExpTest {public void regist(int num) throws MyException {if (num < 0)throw new MyException("人数为负值,不合理", 3);elseSystem.out.println("登记人数" + num);}public void manager() {try {regist(100);} catch (MyException e) {System.out.print("登记失败,出错种类" + e.getId());}System.out.print("本次登记操作结束");}
public static void main(String args[]) {MyExpTest t = new MyExpTest();t.manager();}
}

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

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

相关文章

php index.php 文件路径,自研 PHP 框架 1.0_index.php 文件说明

index.php说明在服务上&#xff0c;PHP 引擎其实只执行了 index.php 这一个文件&#xff0c;index.php 可以抽象的看做是产品的最终型态&#xff0c;app 下的文件规定如何组装&#xff0c;system 下的文件提供基本的“组装零件”&#xff0c;最后拼装成一个完整的产品&#xff…

jaas_受JAAS保护的JAX-RS端点

jaas随着RESTFUL&#xff08;JAX-RS&#xff09;作为创建Web服务端点的“首选”方式的问世&#xff0c;很长一段时间以来&#xff0c;我一直想知道人们如何围绕它实现安全机制。 归根结底&#xff0c;我假设JAX-RS的基础实现是servlet&#xff0c;因此其安全性也可能围绕容器&…

Java多线程(1)--基本概念:程序、进程、线程

程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码&#xff0c;静态对象。 进程(process)是程序的一次执行过程&#xff0c;或是正在运行的一个程序&#xff0c;是一个动态的过程&#xff1a;有它自身的产生、存在和消亡的过程。——生命周…

php中return返回数组,PHP中return返回数组的一点用法

本文就学习中遇到的PHP函数return返回值的问题&#xff0c;这一点return用法进行了说明。在函数的内部用return返回一个值或者为空来结束函数的运行。但是在return一个数组的时候&#xff0c;也可以在函数的内部直接使用print_r来打印。但一般都不这么做。拿上一篇文章举例&…

Thread类的有关常用方法

线程优先级问题 start(): 启动线程&#xff0c;并执行对象的run()方法&#xff08;线程对象.start()&#xff09; run(): 线程在被调度时执行的操作&#xff08;线程对象.start()&#xff09; currentThread(): 返回当前线程&#xff0c;在Thread子类中就是this&#xff0c;通常…

Java中的Volatile如何工作? Java中的volatile关键字示例

如何在Java中使用Volatile关键字 在Java采访中&#xff0c;什么是volatile变量以及何时在Java中使用volatile变量是Java 采访中一个著名的多线程采访问题 。 尽管许多程序员都知道什么是volatile变量&#xff0c;但是他们在第二部分上失败了&#xff0c;即在Java中何处使用vol…

Java线程的调度及线程的优先级

调度策略 Java的调度方法 同优先级线程组成先进先出队列&#xff08;先到先服务&#xff09;&#xff0c;使用时间片策略。 对高优先级&#xff0c;使用优先调度的抢占式策略。 线程的优先级等级 Thread.MAX_PRIORITY&#xff1a;10 Thread.MIN _PRIORITY&#xff1a;1 Threa…

maven 单元测试并行_并行运行单元测试

maven 单元测试并行大约是时候单元测试的开发人员能够使用批注在Parallel中运行测试。 在今天的博客文章中&#xff0c;我们将介绍如何使用Easytest提供的注释使传统的Junit测试并行运行。 易测 是在JUnit之上构建的测试框架&#xff0c;可让您轻松编写和维护测试。 它专注于…

Spring Boot 2应用程序和OAuth 2 –传统方法

这篇文章是3个系列文章中的第二部分&#xff0c;探讨了如何为基于Spring Boot 2的应用程序启用OSO2提供程序SSO。 3个帖子是&#xff1a; 1. 引导兼容OpenID Connect的OAuth2授权服务器/ OpenID提供程序的方法 2.与OAuth2授权服务器/ OpenID提供程序集成的旧版Spring Boot / …

Java多线程(2)--Thread类继承和Runnable接口创建线程

Java语言的JVM允许程序运行多个线程&#xff0c;它通过java.lang.Thread类来体现。 Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的&#xff0c;经常把run()方法的主体称为线程体&#xff0c;通过该Thread对象的start()方法来启动这个线程&#x…

matlab在电磁场与电磁波中的应用,matlab在电磁场与电磁波学习中的应用.docx

matlab在电磁场与电磁波学习中的应用.docx MATLAB在电磁场与电磁波学习中的应用裴逸菲(燕京理工学院信息科学与技术学院&#xff0c;河北廊坊065201)摘要针对电磁场与电磁波在大学课程中的理论性强、概念抽象的特点&#xff0c;在学习中引入MATLAB软件&#xff0c;利用MATLAB的…

Java多线程(3)--线程的生命周期

JDK中用Thread.State类定义了线程的五种状态 要想实现多线程&#xff0c;必须在主线程中创建新的线程对象。Java语言使用Thread类及其子类的对象来表示线程&#xff0c;在它的一个完整的生命周期中通常要经历如下的五种状态&#xff1a; ①新建&#xff1a; 当一个Thread类或…

m序列自相关matlab代码,m序列的输出及其自相关序列

【例10-2】 设m序列的生成多项式为g(x)1x^3x^4&#xff0c;求&#xff1a;(1)m序列的输出及其自相关序列&#xff1b;(2)脉冲波形成为矩形脉冲p(t){1 0≤t≤Tc 画出m序列信号的自相关函数&#xff1b;{0 其它 &#xff0c;(3)设脉冲波形为升余弦函数(滚降系数a0)&#xff0c;画…

JDK 10:从Java访问Java应用程序的进程ID

StackOverflow.com上一个普遍的问题是&#xff1a;“ Java程序如何获得自己的进程ID&#xff1f; 与该问题相关的几个答案包括解析ManagementFactory返回的String 。 getRuntimeMXBean&#xff08;&#xff09; 。 getName&#xff08;&#xff09; [但是可以提供“任意字符串”…

Java多线程(4)--线程的同步解决线程安全问题

多线程出现安全问题 问题的原因&#xff1a; 当多条语句在操作同一个线程共享数据时&#xff0c;一个线程对多条语句只执行了一部分&#xff0c;还没有执行完&#xff0c;另一个线程参与进来执行&#xff0c;导致共享数据的错误。 解决办法&#xff1a; 对多条操作共享数据的…

java中套接字,如何在java中获得一个开放的套接字?

在Java中,我如何获得一个开放的套接字&#xff1f;我有2个JFrame;在第一个JFrame中,我打开了Client socket的连接.在同一个JFrame中,我创建了另一个JFrame(JFrame2)的实例.现在我想从JFrame1获取相同的Socket到JFrame2继续与我的服务器Socket交谈&#xff1a;login.java(First …

Java多线程(5)--线程通信wait和notify

例题&#xff1a;使用两个线程打印 1-100。线程1, 线程2 交替打印。 解决&#xff1a;涉及wait()和notify()/notifyAll() class Communicate implements Runnable {private int number 1;Overridepublic void run() {while (true) {synchronized (this) {this.notify();if (…

matlab eig 复杂度,MATLAB中的eig函数

在MATLAB中&#xff0c;计算矩阵A的特征值和特征向量的函数是eig(A)&#xff0c;常用的调用格式有5种&#xff1a;Eeig(A)&#xff1a;求矩阵A的全部特征值&#xff0c;构成向量E。[V,D]eig(A)&#xff1a;求矩阵A的全部特征值&#xff0c;构成对角阵D&#xff0c;并求A的特征向…

spring常见面试问题_Spring面试问题

spring常见面试问题另外&#xff0c;请查看我们最新的文章69Spring面试问题与解答–最终清单 。 1&#xff09;什么是春天&#xff1f; 回答&#xff1a; Spring是控件和面向方面的容器框架的轻量级反转。 2&#xff09;解释春天&#xff1f; 回答&#xff1a; 轻巧&#x…