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也可以被程序显示地抛出,而且为了程序的可靠性,对一些可能出现的运行时异常的代码区域,程序员最好能够及时的处理这些异常。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏从零开始学 Web 前端

04 - JavaSE之异常处理

2.throw new someExpresion("错误原因"); 表示的是手动抛出异常。 **

1344
来自专栏程序员的知识天地

Python基础为重,成就月薪过万

傻瓜式,傻瓜式的你可以直接点开进行下载,但是智能下载这版本,有的人愿意下载别的版本所以就要用到另外的方法

742
来自专栏xingoo, 一个梦想做发明家的程序员

剑指OFFER之把数组排成最小的数(九度OJ1504)

题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排...

19210
来自专栏技术博客

C#项目代码规范

   小菜就是小菜,几个人搞出来的项目,让公司大牛稍微看了下,最后送出了惨不忍睹四个字。命名各种各样,五花八门,大写英文、小写英文、大写拼音、小写拼音、英文和拼...

1234
来自专栏企鹅号快讯

如何写好python代码

写代码好比画画,好的代码就像一件艺术品,美观、可读性高,让人看着舒服。代码是写给人看的,不是写给机器看的,遵守一定的代码规范很重要,就像写作文需要总分总结构,这...

3947
来自专栏wym

18年暑假多校赛第一场 1002

http://acm.hdu.edu.cn/showproblem.php?pid=6299

831
来自专栏ccylovehs

再也不用被this苦恼了

前端编程对于this再熟悉不过了,今日来个老调重弹温故知新,肯定有很多大佬已经完全吃透了this原理,敬请出门左拐。对于理解this似懂非懂的同学可以借鉴一波

1112
来自专栏前端桃园

通俗的方式理解动态类型,静态类型;强类型,弱类型

1964
来自专栏LuckQI

Redis初识~List命令

1012
来自专栏owent

std和boost的function与bind实现剖析

用过std和boost的function对象和bind函数的童鞋们都知道这玩意用起来腰不酸了,腿不疼了,心情也舒畅了。先上一个简单得示例:

951

扫码关注云+社区