基础回顾

什么是异常?

  在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. 基本HTML结构

    配置:在vs code中声明页面为html,然后添加open in browser,view in browser插件通过快捷键alt+b实现在浏览器中查看编写好的html界面 基本成分: <! ...

  2. 爬取qq号

    import reimport urllib.requestimport osimport jsonimport sslfrom collections import deque #把爬去的数据保存到 ...

  3. maven学习--1.安装与配置

    转自 http://www.cnblogs.com/xdp-gacl/p/3498271.html 1.下载地址:http://maven.apache.org/download.cgi 2.解压缩包 ...

  4. python ftp 传输文件

    # -*- coding: utf-8 -*- # 本地bytes 数据上报服务器同时创建文件from ftplib import FTP import time, _io from constant ...

  5. 非root用户启动redis容器报错mkdir: cannot create directory '/bitnami/redis': Permission denied

    问题:使用docker启动容器时,报错如下 zh@debian:~/testPath$ docker-compose up redis Starting testpath_redis_1 ... do ...

  6. 2-创建spring boot项目

    想要创建一个spring boot项目,最好的方法就是参照官网的例子: https://spring.io/guides/gs/maven/#scratch 创建的过程我就不再啰嗦了,官网描述非常详细 ...

  7. Vue源码解析---数据的双向绑定

    本文主要抽离Vue源码中数据双向绑定的核心代码,解析Vue是如何实现数据的双向绑定 核心思想是ES5的Object.defineProperty()和发布-订阅模式 整体结构 改造Vue实例中的dat ...

  8. mysql中的concat函数,concat_ws函数,concat_group函数之间的区别

    一.CONCAT()函数CONCAT()函数用于将多个字符串连接成一个字符串.使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为+----+ ...

  9. 20175316盛茂淞 2018-2019-2 《Java程序设计》第8周学习总结

    20175316盛茂淞 2018-2019-2 <Java程序设计>第8周学习总结 教材学习内容总结 第十五章 泛型 -- 主要目的是可以建立具有类型安全的集合框架,如链表.散列映射等数据 ...

  10. MySQL远程连接失败(错误码:2003)

    一 环境信息 服务器系统:Ubuntu 18.04 服务器MySQL版本:14.14 Distrib 5.7.25 本地系统:Kali Linux 本地客户端:python3交互模式 本地开发环境:p ...