`
mywebcode
  • 浏览: 998605 次
文章分类
社区版块
存档分类
最新评论

11级_Java_曹建波4.24 异常处理的基础知识

 
阅读更多

异常处理的基础知识

运行时错误(runtimeerror)

在程序运行时出现的一些非正常的现象被称为运行时错误,如除数为0、数组下标越界、文件不存在、内存不够用等等。

分类:根据错误性质将运行时错误分为两类

致命性的错误

非致命性的异常

异常处理的类层次

Java中预定义了很多异常类,每个异常类代表一种运行错误。

常用Exception类的子类:

异常类

描述

NullPointerException

空指针异常

ArrayIndexOutOfBoundsException

数组越界访问异常

ClassNotFoundException

试图访问一个根本不存在的类

IOException

输入/输出异常

NumberFormatException

错误的类型转换异常

ArrayStoreException

当向数组存入错误类型数据时

ArithmeticException

除数为0的算术异常

未被捕获“异常”

“异常”对象是Java运行时对某些“异常”情况作出反应而产生的。如果不处理“异常”会有什么样的情况发生?

例8.1 被0除异常。

class TestException1{

public static void main(String args[]){

int d=0;

int a=42/d;

}

}

class TestException2{

static void subRoutine(){

int d=0;

int a=10/d;

}

public static void main(String args[]){

TestException2.subRoutine();

}

}

Java提供了异常处理机制,通过面向对象的方法来处理异常。

在程序运行的过程中,如果发生了异常,则该程序(或Java虚拟机)生成一个代表该异常类的对象(包含该异常的详细信息),并把交给运行时系统;

运行时系统从生成对象的代码开始,沿方法的调用栈逐层回溯查找,直到找到包含相应处理代码的方法,并把异常对象交给该方法,来处理这一异常。

使用try-catch-finally语句捕获和处理异常

格式:try{

//产生异常的语句

}catch(异常类1 变量){

//异常处理代码

}catch(异常类2 变量){

//异常处理代码

}[finally{

}]

try语句块

将程序中可能出现异常的代码放入try块中。

当try块中有语句引发异常时,系统将不再执行try块中未执行的语句,而执行匹配的catch块。

如果try块中没有语句引发异常,则程序执行完try块中的语句后不执行catch块中的语句,即跳过catch语句,继续执行后面的程序。

catch块

每个try语句后面必须伴随一个或多个catch语句,用于捕捉try语句块所产生的异常并作相应的处理。

catch子句的目标是解决“异常”情况,并像没有出错一样继续运行。

注意:一个try和它的catch语句组成了一个单元。catch子句的范围限制于try语句块中的语句。一个catch语句不能捕获另一个try声明所引发的异常(除非是嵌套的try语句情况)。被try保护的语句声明必须在一个大括号之内。try语句块不能单独使用。

多个catch块
一个catch块只能处理一类异常,当try块中的语句组可能抛出多种异常时,就需要有多个catch块来分别处理各种异常。

try{

int a=args.length;System.out.println("a=" + a);

int b=42/a; int c[]={1}; c[42]=99;

}catch(ArithmeticException e){

System.out.println("div by 0:" + e);

}catch(ArrayIndexOutOfBoundsException e){

System.out.println("array index oob:" + e);

}

一个异常对象能否被一个catch块接收主要看该异常对象与catch块中声明的异常类的匹配情况,当它们满足下面条件中的任一条时,异常对象将被接受:

异常对象是catch块中声明的异常类的实例;

异常对象是catch块中声明的异常类的子类的实例;

异常对象实现了catch块中声明的异常类的接口。

当使用多个catch块时,需注意catch子句排列顺序--先特殊到一般,也就是子类在父类前面。如果子类在父类后面,子类将永远不会到达。

try语句的嵌套
一个try语句可以在另一个try块内部----try语句的嵌套。

每次进入try语句,异常的前后关系都会被压入堆栈。如果一个内部的try语句不含特殊异常的catch处理程序,堆栈将弹出,下一个try语句的catch处理程序将检查是否与之匹配。

这个过程将继续直到一个catch语句匹配成功,或者是直到所有的嵌套try语句被检查耗尽。

如果没有catch语句匹配,Java的运行时系统将处理这个异常。

分析:

(1)当在没有命令行参数的情况下运行程序,外面的try块将产生一个被零除的异常。

(2)程序在有一个命令行参数条件下运行,内部的try块将产生一个被零除的异常。因为与内部的catch块不匹配,它将把该异常传给外部的catch块来处理。

(3)如果在具有两个命令行参数的条件下执行该程序,由内部try块产生一个数组下标越界异常,由内部的catch块处理。

finally语句块

某些情况下,不管异常是否发生,都需要处理某些语句,那么就将这些语句放到finally语句块中。finally语句所包含的代码在任何情况下都会被执行。

一个try语句至少有一个catch语句或finally语句与之匹配,但匹配的catch可以有多个,而finally语句只能有一个,并且finally语句并非必须有的。

抛出异常

Java运行时系统引发的异常

异常的抛出

根据需要人工创建并抛出

人工抛出异常

分析:

(1)main()调用方法demoproc()的过程中捕获并处理空指针异常。

(2)demoproc()方法也进行了相同的异常处理并且捕获该异常后将该异常抛出。

(3)创建异常对象:throw newNullPointerException();
或 throw new NullPointerException(“demo”);

声明抛弃异常

如果一个方法中的代码在运行时可能生成某种异常,但是在本方法中不必要,或者不能确定如何处理此类异常时,则可以使用throws声明抛弃异常;

表明该方法中将不对此类异常进行处理,而由该方法的调用者负责处理;

即系统将在调用该方法的上层方法体内寻找合适的异常处理代码,而不再继续执行该方法的正常处理流程。

声明抛弃异常的格式
类型 方法名([参数表]) throws 异常类型,…{
//方法体;
}

虽然Java的内置异常处理能够处理大多数常见错误,但用户仍需建立自己的异常类型来处理特殊情况。这时可以通过创建Exception的子类来定义自己的异常类。

格式:class 类名 extends Exception{

… …

}

在Java中,对异常进行处理需要考虑以下因素:

如果异常事件是在运行时产生的,并且在JDK API中没有与该异常事件相对应的异常对象,则应创建用户自定义类型的异常对象。

如果可以预测异常对象的类型并且该异常是在程序运行时发生的,则建议应用JDK API中定义的系统异常类型,并且可以抛出这种类型的异常对象由JVM处理。

如果不能确定异常对象的类型以及异常发生的时机,则应该采用系统类型异常对象并由JVM处理。

对应用程序设计失误导致的数组越界、非法变量等类型的异常,如果要全部捕获所有类型的异常对象,会增加系统开销,导致程序的运行效率降低,建议应用程序可以不对此类异常进行捕获,而交由JVM进行处理。

对于实现输入/输出处理、网络通讯和数据库访问功能的代码,必须进行异常对象的捕获和处理 。

从JDK1.4版本开始,Java语言引入了断言(assert)机制。目的:程序调试

测试代码或者调试程序时,总会做出一些假设,断言就是用于在代码中捕捉这些假设

表现形式:断言就是程序中的一条语句,它对一个boolean表达式进行检查

一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态,系统给出警告或退出

如果没有断言机制,Java程序通常使用if-else或switch语句进行变量状态检查。缺点:

由于检查的数据类型不完全相同,这样的语句形式不会统一。

因为检查仅仅是应用在测试阶段,而if-else或switch语句在发布以后仍然将起作用,如果消除这些代码就意味着要注释或者删除这些代码,如果这些代码量很大就意味着工作很繁重并存在风险。

使用断言的优点:

Java程序员用统一的方式处理状态检查问题;

断言只需在发行的时候关闭该功能即可。

断言的开启和关闭

在默认情况下断言是关闭的,因此在使用断言以前,需要先开启断言功能,方法:
java –ea MyClass 或者
java –enableassertions MyClass

关闭断言功能的方法:
java –da MyClass或者
java –disableassertions MyClass

注意:断言检查通常在开发和测试时开启。为了提高性能,在软件发布后,断言检查通常是关闭的。

断言的使用

Java中使用关键字assert标记断言,语法格式为:

assertExpression1
执行到assert语句时,如果Expression1的值为true,则程序正常执行,如果值为false,该语句创建一个Assertion Error对象,并抛出该对象。



assertExpression1:Expression2

当断言失败时,系统会自动将Expression2的值传递给新建的AssertionError对象,进而将其转换为一个消息字符串保存起来,可以获得更多、更有针对性的检查失败细节信息。

什么时候使用断言

通常来说,断言用于检查一些关键的值,并且这些值对整个程序,或者局部功能的完成有很大的影响。

断言表达式应该短小、易懂,如果需要评估复杂的表达式,应该使用函数计算。

使用断言的情况

检查控制流:在if-else和switch语句中,可以在不应该发生的控制支流上加上assert语句。如果这种情况发生了,assert能够检查出来。

在私有方法计算前,检查输入参数是否有效
对于一些private的方法,要求输入满足一些特定的条件,可以在方法开头使用assert进行参数检查;对于公共方法,通常不使用断言检查

在方法计算后,检查方法结果是否有效

检查程序不变量
private boolean isBalance() {
……
}
//
assert isBalance():"balance is destoried";

分享到:
评论

相关推荐

    99-智慧园区数据平台方案.pptx

    99-智慧园区数据平台方案.pptx

    node-v12.11.1-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于Springboot+Vue华强北商城二手手机管理系统-毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    Excel模版:工资条模板

    Excel工资条模板是一种预先设计好的电子表格文件,主要用于生成和打印员工的工资单,让员工清楚了解自己的工资组成和扣款详情。模板通常包含了以下几个关键部分: 1. **员工信息区**: - 姓名 - 员工编号/工号 - 部门 - 职位 2. **工资构成区**: - 基本工资 - 岗位工资 - 绩效奖金 - 加班工资 - 其他补贴(如交通补贴、餐补、全勤奖等) - 各项津贴(如高温补贴、取暖费等) - 其他应发收入(如年终奖、提成、福利等) 3. **扣款项目区**: - 社保扣款(养老保险、医疗保险、失业保险、工伤保险、生育保险) - 住房公积金 - 个人所得税 - 其他扣款(如迟到、旷工、违规罚款等) - 预借还款(如有) 4. **工资结算区**: - 应发工资总额 - 扣款总额 - 实发工资 5. **备注栏**: - 用于标注本月工资的特殊情况说明,如请假、调休、加班等情况。 6. **签名栏**: - 供员工确认工资数额无误后签名,也可以

    29-【智慧城市与政府治理分会场】10亿大数据助推都市治理-30页.pdf

    29-【智慧城市与政府治理分会场】10亿大数据助推都市治理-30页.pdf

    基于Springboot+Vue的租房管理系统-毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    线路工区光缆中断抢险预案.docx

    5G通信行业、网络优化、通信工程建设资料。

    299-教育数据资产管理平台及配套解决方案.pptx

    299-教育数据资产管理平台及配套解决方案.pptx

    太戈编程第345题答案

    abababababababab

    基于STM32F103C8单片机设计-旋转编码器数码管显示程序KEIL工程源码.zip

    STM32学习软件编程资料,STM32F103C8单片机经典外设应用设计实例软件源代码,KEIL工程文件,可供学习参考。

    5GKPI指标定义.pptx

    5G通信行业、网络优化、通信工程建设资料。

    全业务端到端-L2题库.xlsx

    5G通信行业、网络优化、通信工程建设资料

    3M 轨道砂光机精英系列说明书

    3M 轨道砂光机精英系列说明书

    基于Springboot+Vue教师工作量管理系统-毕业源码案例设计.zip

    网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    2023年亚太杯A题附件一,苹果图像数据集

    2023年亚太杯A题附件一,苹果图像数据集

    移动代维发电系统考试L2.xlsx

    5G通信、网络优化与通信建设

    59-《煤矿测量规程(1989版)》150.pdf

    59-《煤矿测量规程(1989版)》150.pdf

    施工现场安全技术交底模板.doc

    5G通信行业、网络优化、通信工程建设资料。

    基于YOLOv7的植物虫害识别&防治系统

    由于当今全球气候变化异常,农作物病虫害频发,而且农作物病种类多,成因复杂,其预防和识别难度较大,且传统病虫害识别方法大多靠人目视手查,需要一定的专家经验,具有主观性强、识别准确率低等缺点.而信息技术作为解决农作物病虫害智能、快速识别的新技术、新方法,我们计划利用农业信息大数据智能决策分析系统,建立完善一体化的智能农业信息监测系统等.本文便是基于深度学习将计算机视觉、图像识别等技术运用于农作物病虫害检测中,开发智能病虫害检测系统,以提高病虫害检测准确率,减少病虫害对农业生产的危害

Global site tag (gtag.js) - Google Analytics