摘要:对异常的处理方法是打印异常的跟踪栈信息并终止程序运行。应尽量对异常进行适当的处理,而不是简单的将异常跟踪栈信息打印出来。
一、异常概述
开发者都希望所有错误都能在编译阶段被发现,就是试图在运行程序之前排除所有错误,但这是不现实的,余下问题必须在运行期间得到解决。 Java将异常分为两种:CheckedException和RuntimeException。其中,CheckedException都是可以在编译期间被处理的异常,而RuntimeException异常则无需处理。 增加了异常处理机制后的程序有更好的容错性,更健壮。二、异常处理机制
Java异常处理机制可以让程序有更好的容错性,让程序更健壮。异常处理机制可以实现将“业务功能实现代码”和“错误处理代码”分离,提供更好的可读性。
1.使用try...catch...捕获异常
把系统业务实现代码放在try块中定义,所有异常处理逻辑放入catch块中进行处理。下面是Java异常处理机制的语法结构:
如果执行try块里的业务逻辑代码出现异常,系统自动生成一个异常对象,该异常对象被提交给Java运行时环境,这个过程被称为抛出异常。
当Java运行时环境收到异常对象时,会自动寻找能处理该异常对象的catch块,如果找到合适的catch块,则把该异常对象交给该catch块处理,这个过程被称为捕获异常。
提示:1.如果程序没有为这段代码定义任何的catch块,则Java运行环境无法找到处理该异常的catch块,程序就在此退出。
2.try块中声明的变量是代码块内局部变量,它只在try块中有效,在catch块中不能访问该变量。
2.异常类的继承体系
Java把所有非正常情况分为:异常(Exception)和错误(Error)他们都继承Throwable父类。 Error错误:一般是指与虚拟机相关的错误,如系统崩溃、虚拟机错误、动态链接失败等。这种错误无法恢复和不可能捕获,将导致应用程序中断。 进行异常捕获时,应遵循先处理小异常,再处理大异常。
3.Java7提供的多异常捕获
从Java7开始,一个catch块可以捕获多种类型异常。 应注意以下2个地方: 1)捕获多个类型的异常时,多种异常类型应用竖线(|)隔开。 2)捕获多个类型的异常时,异常变量有隐式的final修饰,因此程序不能对异常变量重新赋值。
4.使用finally回收资源
有时候,程序在try块中打开了一些物理资源(例如数据库连接等), 这些都必须显式回收。为了保证一定能回收try块中打开的物理资源,异常处理机制提供了finally语句块。不论try块中代码是否出现异常,也不管哪一个catch块被执行,甚至try块或catch块中执行了return语句,finally块总会被执行。但如果在try块或catch块中使用System.exit(1)语句退出虚拟机,则finally块将失去执行机会。 完整的Java异常处理语法结构如下:
通常情况下,不要在finally块中使用如 return或throw等导致方法终止的语句,一旦在finally块中使用此类语句,将导致try块、catch块中的return或throw语句失效。
5.自动关闭资源的try语句
允许在try块关键字后紧跟一对圆括号,圆括号可以声明、初始化一个或多个资源,此处的资指的是那些必须在程序结束时显示关闭资源(如数据库连接,网络连接等),try语句块在该语句块结束时自动关闭这些资源。
为保证try语句块可以正常关闭资源,这些方法必须实现AutoCloseable或Closeable接口,实现这两种接口就必须实现close()方法。
Java将异常分为两种:CheckedException和RuntimeException。
对于CheckedException的处理方式有两种:
1)当前方法知道如何处理该异常,程序使用try...catch...块来捕获该异常,然后在其对应的catch块中处理该异常。
2)当前方法不知道如何处理这种异常,应该在定义方法时声明抛出该异常。
1.使用throws声明抛出异常
使用throws声明抛出异常的思路是:当前方法不知道该如何处理此异常,该异常应该由上一级调用者;如果main()方法也不知道该如何处理此异常,也可用throws声明抛出异常,该异常将交给JVM处理。JVM对异常的处理方法是:打印异常的跟踪栈信息,并终止程序运行。这也就是程序遇到异常后自动结束的原因。
throws声明只能用在方法签名中,throws可声明抛出多个异常类,多个异常类之间用逗号(,)隔开。throws声明语法格式如下:
throws Exception1,Exception2...
一旦使用throws声明抛出该异常,就无需使用try...catch语句块来捕获该异常。
使用throws声明抛出异常时,有一个限制:子类方法声明抛出的异常类型应该是父类方法声明抛出的异常的子类或者相同,子类方法声明抛出的异常不允许比父类方法声明抛出的异常多。
2.使用throw抛出异常
如果需要在程序中自行抛出异常,则应使用throw语句,throw语句可多带带使用,throw语句抛出的不是异常类,而是一个异常实例,且每次只能抛出一个异常实例。throw语句语法格式如下:
throw ExceptionInstance;
3.自定义异常
用户自定义异常都应该继承Exception基类,如果希望自定义Runtim异常,则应继承RuntimeException基类。自定义异常格式如下:
4.异常链
程序捕获原始异常,然后抛出一个新的业务异常,新的业务异常中包含了对用户的提示信息,这种处理方式称为异常转译。
这种把原始信息隐藏起来,仅向上提供必要的异常提示信息的处理方式,可以保证底层异常不会扩散到表现层,可以避免向上暴露太多的实现细节,符合面向对象的封装原则。
这种把捕获一个异常然后紧接着抛出另一个异常,并把原始异常信息保存下来的方式是一种典型的链式处理,也被称为异常链。
四、Java的异常跟踪栈异常对象的printStackTrace()方法用于打印异常的跟踪栈信息,根据printStackTrace()方法的输出结果,可以找到异常的源头,并跟踪到异常的一路触发过程。应尽量对异常进行适当的处理,而不是简单的将异常跟踪栈信息打印出来。
五、异常处理规则1.不要过度使用异常
2.不要使用过于庞大的try块
3.避免使用catchAll语句
4.不要忽略捕获到的异常
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70192.html
摘要:不受检查异常为编译器不要求强制处理的异常,检查异常则是编译器要求必须处置的异常。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止。异常处理涉及到五个关键字,分别是。 概念 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。 异常是程序中的一些错误,但并不是所有的错误都是异常,并...
摘要:根据异常对象判断是否存在异常处理。否则,范围小的异常会因异常处理完成而无法处理。异常处理中使用作为异常的统一出口。 参考《第一行代码java》《java程序设计教程》java中程序的错误有语法错误、语义错误。如果是语法性错误,在编译时就可以检查出来并解决。语义错误是在程序运行时出现的,在编译时没有错误,但在运行时可能会出现错误导致程序退出,这些错误称为异常。在没有异常处理的情况下,也即...
摘要:异常发生时如何处理,提供了解决办法异常处理机制。只要在程序中产生了异常,就会用一个对应类型的异常对象来封装异常,会试图寻找异常处理程序来处理异常。中,异常处理的任务就是将执行控制流从异常发生的地方转移到能够处理这种异常的地方去。 前言 概述:异常就是java程序在运行过程中出现的错误。 异常发生时如何处理,java提供了解决办法:异常处理机制。 java中的异常可以是函数中的语句执行...
捕获和处理异常 本节描述如何使用三个异常处理程序组件 — try、catch和finally块 — 来编写异常处理程序,然后,解释了Java SE 7中引入的try-with-resources语句,try-with-resources语句特别适用于使用Closeable资源的情况,例如流。 本节的最后一部分将介绍一个示例,并分析各种场景中发生的情况。 以下示例定义并实现名为ListOfNumbe...
阅读 796·2023-04-25 22:57
阅读 3049·2021-11-23 10:03
阅读 612·2021-11-22 15:24
阅读 3155·2021-11-02 14:47
阅读 2900·2021-09-10 11:23
阅读 3114·2021-09-06 15:00
阅读 3935·2019-08-30 15:56
阅读 3321·2019-08-30 15:52