Java基础巩固——异常
基础回顾
什么是异常?
在Java程序运行时,常常会出现一些非正常的现象,这种情况称为运行错误。根据其性质可以分为错误和异常。
Java程序中所有抛出的异常都必须从Throwable派生而来。类Throwable有两个直接子类:Error和Exception.
一般来说,最常见的错误有程序进入死循环、内存泄露等。这种情况下,程序运行时本身无法解决问题,只能通过其他程序干预。Java对应的类为Error类。Error类对象由Java虚拟机生成并抛弃(通常Java程序不对这类异常进行处理)。
异常是程序执行时遇到的非正常情况或意外行为。以下这些情况一般都可以引发异常;代码或调用的代码中有错误,操作系统资源不可用,公共语言运行库遇到意外情况。常见的有数组下标越界、算法溢出、除数为零、无效参数、内存溢出等。这种情况不像错误那样,程序运行时本身可以解决,由异常代码调整程序运行方向,使程序仍可继续运行,直至运行结束。
Java异常对应的类为Exception类。Exception类对象是Java程序处理或者抛弃的对象,它有各种不同的子类分别对应与不同类型的异常。Java编译器要求程序必须捕获或声明所有的非运行时异常,但对于运行时异常可以不做处理。其中类RuntimeException代表运行时由Java虚拟机生成的异常,原因是编程错误。其他则为非运行时异常,原因是程序碰到了意外情况,如输入\输出异常IOException等。
异常关键字
Java异常处理的关键语句有五个:try、catch、throw、throws、finally。其中try、catch、finally三个语句块应注意的问题如下。
1.try、catch、finally三个语句均不能单独使用,三者可以组合,try---catch---finally、try---catch、try---finally三种结构,catch语句可以有一个或者多个,finally语句最多一个。
2.try、catch、finally三个代码块中变量的作用域为代码块内部,分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。
3.若有多个catch块,只会匹配其中一个异常类并执行catch块代码,而不会执行再执行别的catch块,并且匹配catch语句的顺序是由上到下的。
4.throw关键字用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,则还应该在头部声明方法可能抛出的异常类型。该方法的调用者必须检查抛出的异常。如果所有的方法都层层上抛获取的异常,最终JVM会进行处理会进行处理,就是打印异常消息和堆栈信息。如果抛出的Error或RuntimeException,则该方法的调用者可选择处理该异常。
5.thorws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣地打印堆栈信息来处理。
异常处理中常见的问题
1.过于庞大的try块
某些程序把大量的代码块放入当个try块,试图用一个catch语句捕获所有的异常和处理所有可能出现的异常,实际上这是一个坏习惯。原因就在于为了图省事,不愿花时间分析一大块代码中哪几行会抛出异常、异常的具体类型是什么。把大量的语句装入单个巨大的try块就像是出门旅游时把全部家当塞入集装箱带走,虽然东西带上了,但要找出来可不容易。
对于这种问题,可以设置多个异常抛出点来解决。异常对象从产生点产生后,到被捕捉后终止生命的全过程中,实际上是一个传值的过程,所以,应根据实际来合理控制异常个数。catch语句表示会出现某种异常,而且希望能够处理该异常。所以语句中就应该尽量具体异常类型,也可以使用多个catch,用于分别处理不同的异常。
2.异常的完整性
在Java语言中,如果一个函数运行时可能会向上层调用者函数抛出一个异常,那么,他就必须在该函数的声明中显示地注明(采用throws关键字)。否则编译器会抛出错误信息“must be caught or declared to be thrown”,其中“must be caught”指在Java的异常处理模型中,要求所有被抛出的异常都必须有对应的“异常处理模块”。如果你在程序中利用throw出现一个异常,那么在你的程序中,就必须要用catch处理这个异常。
3.RuntimeException异常
在Java异常处理中,一般有两类异常:其一,就是通过throw语句,程序员在代码中人为的抛出的异常;另外一个是系统运行时异常,例如:被零除,空字符串,无效句柄等,对于这类异常,程序员实际上完全可以避免它,只要我们写代码时足够小心严谨。因为,为了彻底解决这种隐患,提高程序整体可靠性,使用RuntimeException异常就是为了实现这样的功能。
针对RuntimeException类型的异常,javac是无法通过编译的静态语法检测来判断到底哪些函数可能抛出这类异常,也这因为如此,Java异常处理模型中“must be caught or declared to be thrown”规则也不适用于次。当然RuntimeException也可以被程序显示地抛出,而且为了程序的可靠性,对一些可能出现的运行时异常的代码区域,程序员最好能够及时的处理这些异常。
Java基础巩固——异常的更多相关文章
- java基础之异常 · fossi
在开发中,异常处理是一个不可绕开的话题,我们对于异常的处理已经非常熟练了,对于异常本身的概念.用法等不再赘述了,直接结合面试问题来加深对异常的理解吧. Throwable 可以用来表示任何可以作为异常 ...
- 【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!
目录 1.异常 1.1 异常概念 1.2 异常体系 1.3 异常分类 1.4 异常的产生过程解析 2. 异常的处理 2.1 抛出异常throw 2.2 Objects非空判断 2.3 声明异常thro ...
- JAVA基础知识|异常
一.基础知识 处理异常,java提供了一个优秀的解决方案:异常处理机制. java把异常当作对象来处理,所有的异常都是由Throwable继承而来,但在下一层立即分解为两个分支:Error和Excep ...
- 【java基础之异常】死了都要try
目录 1.异常 1.1 异常概念 1.2 异常体系 1.3 异常分类 1.4 异常的产生过程解析 2. 异常的处理 2.1 抛出异常throw 2.2 Objects非空判断 2.3 声明异常thro ...
- Java基础笔记-异常
Java中的异常机制: Throwable类是 Java 语言中所有错误或异常的超类.主要包括两个子类: Error和Exception. 一般中要处理的异常是Exception. Java中最常见的 ...
- Java基础之异常
1.异常的概念 异常:程序在运行时出现的不正常情况,也可以说是出现的问题: Java中的异常:出现的不正常的问题也是一类事物,这类事物有一些共性的东西,比如有名称,有产生的原因等,将这些共性的部分抽取 ...
- 黑马程序员----java基础:异常
dff ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 经常写程序的人对try...catch...finally语句肯定是不陌生的了.但是好多 ...
- java基础(21):异常
1. 异常 什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 1.1 ...
- java基础之异常。
异常: (1)异常:异常就是Java程序在运行过程中出现的错误. 异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象.其实就是Java对不正常情况进行描述后 ...
- 第一阶段:Java基础之异常和处理
文章目录 Java中异常处理机制的简单和应用 一.异常的体系结构&分类 二.问题扩展 三.应用场景 Java中异常处理机制的简单和应用 异常也是一种对象,Java中有很多异常类,并且定义了基类 ...
随机推荐
- python数据库进阶
第1节 MySQL基础 一,说明 1,认识MySQL与创建用户 MySQL是最流行的关系型数据库管理系统之一,由瑞典MySQL AB公司开发,目前属于Oracle公司.MySQL是一种关联数据管理系统 ...
- Spring Cloud的概述(二)
1.什么是spring cloud? spring cloud,基于spring boot提供了一套微服务的解决方案,包括服务的注册与发现,配置中心,全链路监控,服务网管,负载均衡,熔断等组件,除了基 ...
- linux下编译protobuf(可以编译成pb.go)
编译前需要安装gtest $ cd googletest $ cmake -DBUILD_SHARED_LIBS=ON . $ make $ sudo cp -a include/gtest /hom ...
- 使用DOS命令无法启动MySQL
今天使用命令dos 命令 net start mysql 启动mysql的使用出现以下情况 无法正常启动mysql服务. 原因是: 启动dos命令窗口时的用户权限太低,无法正常使用 解决办法: 搜索c ...
- CSS碎片
1.外边距不会应用到行内非替换元素的顶端和底端,因为不会改变它的行高,所有没有视觉效果. 而行内非替换元素上下内边距虽然也不改变行高,但却能延伸背景,所有背景可见,可能会重叠其他行. span{mar ...
- 使用JS在页面进行数据处理时显示等待画面
使用js在页面进行数据处理期间显示等待画面: 在页面选择执行函数进行数据处理期间,显示等待画面. <script> function fun(the,row_id) { //测试函数 // ...
- BaseDao.util(虎大将军)
package logistics.util; import java.sql.Connection; import java.sql.PreparedStatement; import java.s ...
- 浅析b-树 b+树 以及Mysql的Innodb,Myisam引擎
B-树性质 B-树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点. 1根节点至少有两个子节点 2每个节点有M-1个key,并且以升序排列 3位于M-1和M key的子节点的值位于 ...
- short s=1;s=s+1;short s=1;s+=1;有什么区别?
short s = 1; s = s + 1; 这个编译一定是不通过的,会提示损失精度. short s = 1; s += 1: 这个编译反而可以通过. 隐式类型转换可以由小到大自动转,即byte ...
- SQL语句操作数据
--切换数据库:手动切换和命令切换 use MySchool --向Student表中插入数据 --语法:INSERT [INTO] 表名 (列名) VALUES (值列表) --注意事项: --1. ...