在程序运行过程中,如果JVM检测出一个不可能执行的操作,就会出现运行时错误。

  在Java中,运行时错误会作为异常抛出。异常就是一个对象,表示阻止正常进行程序执行的错误或者情况。如果异常没有被处理,那么程序将会非正常终止。


  异常是从方法抛出的。方法的调用者可以捕获以及处理该异常。

  throw语句的执行称为抛出一个异常。异常就是一个从异常类创建的对象。

  当异常被抛出时,正常的执行流程就被中断。就像它的名字所提示的,“抛出异常”就是将异常从一个地方传递到另一个地方。调用方法的语句包含在一个try块和一个catch块中。

  throw语句类似于方法调用,但不同于调用方法的是,它调用的是catch块。从某种意义上讲,catch块就像带参数的方法定义,这些参数匹配抛出的值的类型。但是,它不像方法,在执行完catch块之后,程序控制不再返回到throw语句;而是执行catch块后的下一条语句。

  一个异常可能是通过try块中的throw语句直接抛出的,或者调用一个可能会抛出异常的方法而抛出。

  使用异常处理的优点:它能使方法抛出一个异常给它的调用者,并由调用者处理该异常。如果没有这个能力,那么被调用方法就必须自己处理异常或者终止该程序。被调用的方法通常不知道在出错的情况下该做什么,这是库方法的一般情况。库方法可以检测出错误,但是只有调用者才知道出现错误时需要做些什么。异常处理最根本的优势就是将检测错误(由被调用的方法完成)从处理错误(由调用方法完成)中分离出来。


  异常时对象,而对象都采用类来定义。异常的根类是java.lang.Throwable。

  Java API中有很多预定义的异常类。

        

  Throwable类是所有异常类的根类。所有的Java异常类都直接或者间接地继承自Throwable。可以通过继承Exception或者Exception的子类来创建自己的异常类。

  这些异常类可以分为三种主要类型:系统错误、异常和运行时异常。

  系统错误是由Java虚拟机抛出的,用Error类表示。Error类描述的是内部系统错误。这样的错误很少发生。如果发生了,除了通知用户以及尽量稳妥地终止程序外,几乎什么也不能做。

  异常是用Exception类表示的,它描述的是由程序和外部环境所引起的错误,这些错误能被程序捕获和处理。ClassNotFoundException、IOException

  运行时异常是用RuntimeException类表示的,它描述的是程序设计错误,例如,错误的类型转换、访问一个越界数组或数值错误。运行时异常通常是由Java虚拟机抛出的。ArithmeticException、NullPointerException、IndexOutOfBoundsException

  RuntimeException、Error以及它们的子类都称为免检异常。所有其他异常都称为必检异常,意思是指编译器会强制程序员检查并通过try-catch块处理它们,或者在方法头进行声明。

  在大多数情况下,免检异常都会反映出程序设计上不可恢复的逻辑错误。例如,如果通过一个引用变量访问一个对象之前并未将一个对象赋值给它,就会抛出NullPointerException;如果访问一个数组的越界元素,就会抛出IndexOutOfBoundsException异常,这些都是程序中必须纠正的逻辑错误。免检异常可能在程序的任何一个地方出现。为避免过多地使用try-catch块,Java语言不强制要求编写代码捕获或声明免检异常。


  异常的处理器是通过从当前的方法开始,沿着方法调用链,按照异常的反向传播方向找到的。

  Java的异常处理模型基于三种操作:声明一个异常、抛出一个异常和捕获一个异常。

  声明异常

  在Java中,当前执行的语句必属于某个方法。Java解释器调用main方法开始执行一个程序。每个方法都必须声明它可能抛出的必检异常类型。这称为声明异常。因为任何代码都可能发生系统错误和运行时错误,因此,Java不要求在方法中显示声明Error和RuntimeException (免检异常)。但是,方法要抛出的其他异常都必须在方法头中显示声明,这样,方法的调用者会被告知有异常。

  如果方法没有在父类中声明异常,那么就不能在子类中对其进行继承来声明异常。

  抛出异常

  检测到错误的程序可以创建一个适合的异常类型的实例并抛出它,这就称为抛出一个异常。

    IllegalArgumentException ex = new IllegalArgumentException ("Wrong Argument");

    throw ex;

    或者,根据偏好,也可以使用下面的语句:

    throw new IllegalArgumentException (“Wrong Argument”);

  声明异常的关键字是throws,抛出异常的关键字是throw。

  捕获异常

  如果在执行try块的过程中没有出现异常,则跳过catch子句。

  如果try块中的某条语句抛出一个异常,Java就会跳过try块中剩余的语句,然后开始查找处理这个异常的代码的过程。处理这个异常的代码称为异常处理器;可以从当前的方法开始,沿着方法调用链,按照异常的反向传播方向找到这个处理器。从第一个到最后一个逐个检查catch块,判断在catch块中的异常类实例是否是该异常对象的类型。如果是,就将该异常对象赋给所声明的变量,然后执行catch块中的代码。如果没有发现异常处理器,Java会退出这个方法,把异常传递给调用这个方法的方法,继续同样的过程来查找处理器。如果在调用的方法链中找不到处理器,程序就会终止并且在控制台上打印出错信息。寻找处理器的过程称为捕获一个异常。P393

  从一个通用的父类可以派生出各种异常类。如果一个catch块可以捕获一个父类的异常对象,它就能捕获那个父类的所有子类的异常对象。

  在catch块中异常被指定的顺序是非常重要的。如果父类的catch块出现在子类的catch之前,就会导致编译错误。

  Java强迫程序员处理必检异常,如果方法声明了一个必检异常(即Error或RuntimeException之外的异常),就必须在try-catch中调用它,或者在调用方法中声明要抛出异常。

  从异常中获取信息

  异常对象包含关于异常的有价值的信息。可以利用下面这些java.lang.Throwable类中的实例方法获取有关异常的信息。printStackTrace()方法在控制台上打印栈跟踪信息。getStackTrace()方法提供编程的方式,来访问由printStackTrace()打印输出的栈跟踪信息。

  在异常事件中,执行仍然会继续。如果处理器没有捕获到这个异常,程序就会突然中断。


finally子句

  无论异常是否产生,finally子句总是会被执行。

  有时候,不论异常是否出现或者是否被捕获,都希望执行某些代码。Java有一个finally子句,可以用来达到这个目的。

  在任何情况下,finally块中的代码都会执行,不论try块中是否出现异常或者是否被捕获。考虑下面三种可能的情况:

  (1)如果try块中没有出现异常,执行finalStatements,然后执行try语句的下一条语句。

  (2)如果try块中有一条语句引起异常,并被catch捕获,然后跳过try块的其他语句,执行catch块和finally子句。执行try语句之后的下一条语句。

  (3)如果try块中有一条语句引起异常,但是没有被任何catch块捕获,就会跳过try块中的其他语句,执行finally子句,并且将异常传递给这个方法的调用者。

  即使在到达finally块之前有一个return语句,finally块还是会执行。


何时使用异常

  当错误需要被方法的调用者处理的时候,方法应该抛出一个异常。

  try块包含正常情况下执行的代码。catch块包含异常情况下执行的代码。异常处理将处理错误的代码从正常的程序设计任务中分离出来,这样,可以使程序更易读、更易修改。但是,应该注意,由于异常处理需要初始化新的异常对象,需要从调用栈返回,而且还需要沿着方法调用链来传播异常(这里注意方法调用的方向和异常传播的方向是相反的)以便找到它的异常处理器,所以,异常处理通常需要更多的时间和资源。

  异常出现在方法中。如果想让该方法的调用者处理异常,应该创建一个异常对象并将其抛出。如果能在发生异常的方法中处理异常,无须抛出异常。


重新抛出异常

  如果异常处理器不能处理一个异常,或者只是简单地希望它的调用者注意到该异常,Java允许该异常的处理器重新抛出异常。

try{statements;
}
catch(TheException ex)
{perform operation before exits;throw ex;
}

  语句throw ex重新抛出异常给调用者,以便调用者的其他处理器获得处理异常ex的机会。


创建自定义异常

  可以通过派生java.lang.Exception类来定义一个自定义异常类

  如果遇到一个不能用预定义异常恰当描述的问题,那就可以通过派生Exception类或其子类,例如IOException,来创建自己的异常类。


转载于:https://www.cnblogs.com/baojianxin/p/9313321.html

Java基础——异常处理相关推荐

  1. 【学习笔记】JAVA基础——异常处理部分

    文章目录 前言 简介 一. try.catch与finally ① try && catch ② finally ③ throws 补充:JVM 相关 二. 异常的分类 ① 分类解释与 ...

  2. Java基础-异常处理机制

    //什么是异常? 程序运行的过程中发生的各种错误 //为什么学习异常? 1.让程序逻辑思维更健康 2.有能力解决异常 //A异常的分类 //1 未检查异常:编译时不报错,运行时可能出错.[实质上是一些 ...

  3. java基础-异常处理

    java异常包括一下几种: 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的.例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略. 运行时异 ...

  4. 菜鸟学习笔记:Java基础篇7(包装类、时间相关类、文件类、异常处理类)

    菜鸟学习笔记:Java其他常用类 基本数据类型包装类 时间处理和文件处理相关类 Date时间类 SimpleDateFormat Calendar日历类 文件类 异常机制 异常的概念 Java异常处理 ...

  5. Java基础教程【第九章:异常处理】

    章节目录 1. java 异常处理 1.1 什么是异常 1.2 java 的异常处理 1.3 异常示例 1.4 异常处理的基础 1.5 异常处理机制 1.6 常见异常及用途 2. throw 语句 3 ...

  6. Java基础篇:什么是异常,异常处理的基础是什么?

    异常是在运行时代码序列中产生一种异常情况.换句话说,异常是一个运行时错误.在不支持异常处理的计算机语言中,错误必须被手工的检查和处理--典型的是通过错误代码的运用等等.这种方法既很笨拙也很麻烦. Ja ...

  7. 清华学长免费分享Java基础核心知识大总结(1)

    自学Java,如果觉得看<Java编程思想>或者<Core Java>等之类的"圣经"觉得内容太多,一下子吃不透的话,不妨看看这本<Java基础核心总 ...

  8. 给Java新手的一些建议——Java知识点归纳(Java基础部分)

    写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给 ...

  9. Java基础、多线程、JVM、集合八股文自述(持续更新)

    Java基础.多线程.JVM.集合八股文自述 一.Java基础 1.1 object类有哪些方法? getClass().hashCode().equals().clone().toString(). ...

最新文章

  1. 【NLP招聘动态】太难啦!面试官盘点NLP近五年招聘动态
  2. 微信小程序小结02-- 完整的demo
  3. python版本与编码的区别
  4. 罗辑思维首席架构师:Go微服务改造实践
  5. VMware Workstation All Key
  6. 是否要运行此应用程序_使用Delve调试Go应用程序
  7. ambassador 学习七 Mapping说明
  8. 【Spark-core学习之六】 Spark资源调度和任务调度
  9. [转帖]ESXi 网卡绑定 增加吞吐量的方法
  10. 3月11日Linux课程笔记
  11. 百度云 api java_java实现百度云文字识别接口代码
  12. Excel VBA 学习总结 - 基础知识
  13. 微信小程序---详情页
  14. macbook 安装win7
  15. jquery控制div的显示与隐藏
  16. linux find返回数据不一样,Linux学习笔记——find命令
  17. UWP中的Direct2D
  18. Teamview 禁用QuickConnect按钮
  19. b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释
  20. linux irc工具,构建基于Linux下的IRC服务器和WEBIRC登陆平台

热门文章

  1. 浅析Codewarrior、IAR和Keil MDK三大开发环境优缺点
  2. 系统学习机器学习之监督学习
  3. 关于i++和++i的实验结果解释
  4. linux用卸载软件管理,Linux下软件的安装卸载管理
  5. 信捷伺服刚性调整_伺服系统增益协调的作用及举例说明,文末有伺服产品调试学习PPT!...
  6. mysql数据库开发规范_开发规范——MYSQL数据库
  7. python无穷大整数_python的特殊数字类型(无穷大、无穷小等)
  8. 数组元素数组中的元素通过解析字符串参数获得
  9. python修改linux网卡信息,linux下修改网卡接口名称
  10. 东软java的笔试_东软的笔试题