基础回顾

什么是异常?

  在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基础巩固——异常的更多相关文章

  1. java基础之异常 · fossi

    在开发中,异常处理是一个不可绕开的话题,我们对于异常的处理已经非常熟练了,对于异常本身的概念.用法等不再赘述了,直接结合面试问题来加深对异常的理解吧. Throwable 可以用来表示任何可以作为异常 ...

  2. 【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!

    目录 1.异常 1.1 异常概念 1.2 异常体系 1.3 异常分类 1.4 异常的产生过程解析 2. 异常的处理 2.1 抛出异常throw 2.2 Objects非空判断 2.3 声明异常thro ...

  3. JAVA基础知识|异常

    一.基础知识 处理异常,java提供了一个优秀的解决方案:异常处理机制. java把异常当作对象来处理,所有的异常都是由Throwable继承而来,但在下一层立即分解为两个分支:Error和Excep ...

  4. 【java基础之异常】死了都要try

    目录 1.异常 1.1 异常概念 1.2 异常体系 1.3 异常分类 1.4 异常的产生过程解析 2. 异常的处理 2.1 抛出异常throw 2.2 Objects非空判断 2.3 声明异常thro ...

  5. Java基础笔记-异常

    Java中的异常机制: Throwable类是 Java 语言中所有错误或异常的超类.主要包括两个子类: Error和Exception. 一般中要处理的异常是Exception. Java中最常见的 ...

  6. Java基础之异常

    1.异常的概念 异常:程序在运行时出现的不正常情况,也可以说是出现的问题: Java中的异常:出现的不正常的问题也是一类事物,这类事物有一些共性的东西,比如有名称,有产生的原因等,将这些共性的部分抽取 ...

  7. 黑马程序员----java基础:异常

    dff ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 经常写程序的人对try...catch...finally语句肯定是不陌生的了.但是好多 ...

  8. java基础(21):异常

    1. 异常 什么是异常?Java代码在运行时期发生的问题就是异常. 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 1.1 ...

  9. java基础之异常。

    异常: (1)异常:异常就是Java程序在运行过程中出现的错误. 异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象.其实就是Java对不正常情况进行描述后 ...

  10. 第一阶段:Java基础之异常和处理

    文章目录 Java中异常处理机制的简单和应用 一.异常的体系结构&分类 二.问题扩展 三.应用场景 Java中异常处理机制的简单和应用 异常也是一种对象,Java中有很多异常类,并且定义了基类 ...

随机推荐

  1. Div+CSS+JQuery实现选项卡,即通过点击不同的li跳转到不同的div中显示不同的内容或者执行不同的操作。

    1.代码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html>   ...

  2. jenkins远程执行脚本时报Bad version number in .class file

    这几天在学习jenkins的持续集成和部署,到了最后一步启动服务的时候,遇到了一个这个Bad version number in .class file的报错(如下图). 这个报错在最开始手工部署的时 ...

  3. hbase-读操作

    (学习笔记) client和regionServer连接,通过rowkey查找对应的region 多个列簇生成多个storeScaner 每个storeScaner生成一个MemstoreScanne ...

  4. python基础之小数据池

    一,id,is,== 在Python中,id是什么?id是内存地址,比如你利用id()内置函数去查询一个数据的内存地址: name = '太白' print(id(name)) # 158583128 ...

  5. Django使用第三方模块django-password-reset重置密码

    网上关于django第三方模块django-password-reset重置密码的几篇博客有一个严重的bug 见博客:https://blog.csdn.net/qq_42820268/article ...

  6. zz-人生感悟

    1. 社交感想 首先来看一下聪明人和普通人的区别是什么? 普通人思考问题都是一步一步的来,由A推理出B,B推导到C,再推导出D,最后得出E,然而聪明人却可以由A直接推算到E. 这就像开车,普通人的是手 ...

  7. IT人保护视力的10个有效方法

    保护视力锻炼十法   有关资料表明:近年来,我国中小学生的近视率呈逐年增长的趋势,1993年底已高达60左右.众所周知,近视除了与遗传有一定联系外,还与光线不足.近距离阅读过多等眼睛过度疲劳密切相关. ...

  8. Flip String to Monotone Increasing LT926

    A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possibly 0), ...

  9. 安装jdk1.8导致eclipse显示问题

    安装jdk1.8后新建workspace(mars)后eclipse的toolbar和主题显示有问题 例如: 修改步骤 1.设置主题window->Preferences->General ...

  10. JAVA实训第三次作业

    编写"学生"类及其测试类. 5.1 "学生"类: 类名:Student 属性:姓名.性别.年龄.学号.5门课程的成绩 方法1:在控制台输出各个属性的值. 方法2 ...