先看图
Exception是所有异常的父类,所以他的子类,除了RuntimeException及其子类,是属于编译时异常(检查异常或者叫非运行时异常)。这种异常必须在代码里被显示的捕获语句包住,否则编译不过,而RuntimeException及其子类表示运行时异常,不强制要求写出显示的捕获代码,但如果没有被捕获到,则线程会被强制中断。
Java异常机制是为了把异常处理的代码与正常流程的代码分开,避免程序中出现过多的像传统程序那样的非法值判断语句,以致于扰乱了正常流程
编译时异常是Java特有的,了解异常处理流程
class Test { public static void main(String args[]) { System.out.println(Test.test()); } @SuppressWarnings("finally") public static String test() { try { System.out.println("try"); throw new Exception(); } catch (Exception e) { System.out.println("catch"); return "return"; } finally { System.out.println("finally"); return "return in finally"; } } }
如何处理编译时异常:编译时异常出生的目的--捕获异常,并恢复继续执行程序,这种情况就是在主方案行不通时,用备选方案,而且主方案能否行通不能事先知道,必须执行的时候才能知道,所以在一般情况下,备选方案比主方案要的运行结果要差
Throwable是所有异常和错误的父类,它的两个子类Exception和Error分别代表异常和错误
其中Exception又可以分为RuntimeException和非RuntimeException。
RuntimeException也称为unchecked exception(不检查异常),非RuntimeException也称为checked exception(检查异常)
下面将详细讲述这些异常之间的区别与联系:
1、Error与Exception
Error(错误)表示运行应用程序中较严重问题, 是程序无法处理的错误。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。比如OutOfMemoryError、ThreadDeath等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
Exception(异常)是应用程序中可能的可预测、可恢复问题。一般大多数异常表示中度到轻度的问题。异常一般是在特定环境下产生的,通常出现在代码的特定方法和操作中。在 EchoInput 类中,当试图调用 readLine 方法时,可能出现 IOException 异常。
2、运行时异常和非运行时异常
Exception是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。
运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。
从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。
如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
unchecked异常:
表示错误,程序的逻辑错误。是RuntimeException的子类,比如IllegalArgumentException, NullPointerException和IllegalStateException。
不需要在代码中显式地捕获unchecked异常做处理。
继承自java.lang.RuntimeException(而java.lang.RuntimeException继承自java.lang.Exception)。
Java中的checked异常需要在代码中显式地通过try-catch捕获或者再抛出,如果不需要对这个异常做处理,可以简地将异常再次抛出,这种异常存在一点不足,很多人习惯在代码中直接写一个空的catch块,这样不但使代码变得有些冗余和“丑陋”,而且给调试带来麻烦,增加了代码维护的难度。所以有人说checked使代码变的冗长,空的catch块也没什么意义,所以checked异常应该从Java标准中去除,像C#中就没有checked异常的概念,C#中不强制显式地捕获异常。
Java异常之所以会分为这两种,应该是出于如下考虑:
checked异常可以帮助开发人员意识到哪一行有可能会出现异常,因为Java的API已经说明了调用哪些方法可能会抛出异常。如果不做处理编译就不能通过,从某种程度上说,这种做法可以避免程序的一些错误。
unChecked异常也称为运行时异常,通常RuntimeException都表示用户无法恢复的异常(不改代码无法恢复),如无法获得数据库连接,不能打开文件等。虽然用户也可以像处理checked异常一样捕获unChecked异常。但是如果调用者并没有去捕获unChecked异常时,编译器并不会强制你那么做。
例:比如一个把字符转换为整型数值的代码如下:
java 代码:
String str = “123”;
int value = Integer.parseInt(str);
parseInt的方法签名为:
public static int parseInt(String s) throws NumberFormatException
当传入的参数不能转换成相应的整数时,将会抛出NumberFormatException。因为NumberFormatException扩展于RuntimeException,是unChecked异常。所以调用parseInt方法时无需要try…catch
public boolean createNewFile() throws IOException {}
IOException属于检查异常
try... catch
checked异常
1、非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。
2、从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常
3、表示无效,不是程序中可以预测的。比如无效的用户输入,文件不存在,网络或者数据库链接错误。这些都是外在的原因,都不是程序内部可以控制的。
必须在代码中显式地处理。比如try-catch块处理,或者给所在的方法加上throws说明,将异常抛到调用栈的上一层。
继承自java.lang.Exception(java.lang.RuntimeException除外)。
缺点: checked异常导致了太多的try…catch代码
选择使用哪种异常?
如果一个异常是可以恢复的,可以被调用者正确处理的,使用checked异常。
在使用unChecked异常时,必须在在方法声明中详细的说明该方法可能会抛出的unChekced异常。由调用者自己去决定是否捕获unChecked异常
如果不能确定时,使用unchecked异常。并详细描述可能会抛出的异常,以让调用者决定是否进行处理。
如何记录异常 (http://www.cnblogs.com/elaron/archive/2012/11/12/2766776.html)
1、Java异常分为checked异常和unchecked异常
checked异常(需要在代码中try……catch显示捕获)
所有继承java.lang.Exception的异常。是可以在执行过程中恢复的。此类异常不是程序中可以预测的,比如无效的用户输入、文件不存在等。这些都是外在的原因,都不是程序内部可以控制的。
unchecked异常(也叫错误,不需要显示捕获)
所有继承java.lang.RuntimeException的异常。是无法处理的错误。
2、异常到底应该在什么位置被记录?
在异常最初产生的位置。
如果是可以处理的异常,则处理之后不做记录。如果是无法处理的异常,则把可以仅仅把它封装成另一种异常并往上抛,不必再把已记录过的异常再记录一次。
3、记录异常不属于异常类的行为,记录异常类应该由专门的日志系统去做。
4、为系统提供一个异常处理框架,由框架来决定是否记录异常和怎么记录异常,而不是由普通程序员去做。
5、对于一个应用程序来说,发生所有异常在用户看来都是应用系统内部的异常。因此应该设计一套应用系统的异常框架,以处理系统运行过程中的所有异常。
可以设计一个应用系统的通用类,如AppException,并且这个异常以及这个异常的子类都是运行应用系统时发生的,因此AppException家族应该继承于RuntimeException,这样系统中所有的其他异常都转移为AppException,当异常发生时,前端统一接收到AppException并做统一的处理。
6、通用异常处理框架中需要提供配置信息的支持以及统一的异常处理类和异常日志记录类管理,并允许用户以插件形式扩展自定义的异常处理或日志记录方式。
回顾全文,总结一下Java异常处理的要点:
1、 异常是程序运行过程过程出现的错误,在Java中用类来描述,用对象来表示具体的异常。
Java将其区分为Error与Exception,Error是程序无力处理的错误,Exception是程序可以处理的错误。
异常处理是为了程序的健壮性。
2、 Java异常类来自于Java API定义和用户扩展。通过继承Java API异常类可以实现异常的转译。
3、 异常能处理就处理,不能处理就抛出,最终没有处理的异常JVM会进行处理。
4、 异常可以传播,也可以相互转译,但应该根据需要选择合理的异常转译的方向。
附件;java异常体系
参考:http://www.cnblogs.com/wjq117/archive/2012/05/07/exception.html
参考: Java异常处理终结篇——如何进行Java异常处理设计
其他资料参考:http://lavasoft.blog.51cto.com/62575/18920/
相关推荐
本文将从 Java 异常的基本概念和语法开始,讲述 Java 异常处理的基本知识,分析 Java 异常体系结构,对比 Spring 的异常处理框架,阐述异常处理的基本原则,并提出了自己处理一个大型应用系统异常的思想,并通过设计...
Java异常处理是编程中至关重要的一个环节,它允许开发者优雅地处理程序运行时可能出现的错误,确保程序的健壮性和稳定性。Java中的异常处理机制基于一个独特的概念——异常(Exception),这是一种表示程序运行中...
### 浅析JAVA异常处理机制 #### 一、Java异常处理机制概述 异常处理是Java语言中的一个重要机制,它能够确保程序在遇到不可预料的情况时仍能维持稳定运行。异常处理主要包括三个方面:捕获异常、控制程序流程以及...
Java异常体系结构是Java语言的重要组成部分,它负责处理程序执行过程中出现的错误情况。在Java中,异常由Throwable类及其子类构成。Throwable是所有异常的顶层父类,它有两个直接子类:Error和Exception。Error类...
### Java异常处理总结 #### 一、Java异常的基础知识 在Java编程中,异常处理是一项极其重要的技术。异常处理能够帮助开发者优雅地处理程序运行时遇到的问题,避免程序崩溃,并提供给用户友好的反馈信息。 **什么...
### Java异常处理 #### 一、异常的基本概念 在编程领域中,异常是指程序在运行过程中遇到的问题或错误状态,这些问题通常会导致程序无法按照预期的方式继续执行。在Java语言中,异常处理是一种重要的机制,用于...
首先,我们来看一下Java异常处理的优点: 1. **提高程序的健壮性**:通过捕捉和处理异常,程序可以继续执行,而不是因为一个未预期的问题就终止运行。这提高了程序的健壮性,使其在面对异常情况时依然能够提供服务...
Java异常处理是编程中必不可少的部分,用于处理程序运行时可能出现的错误情况。异常是程序执行过程中遇到的非正常状态,可能导致程序中断。Java提供了强大的异常处理机制来确保程序的健壮性和稳定性。 1- 什么是...
以下是关于Java异常处理机制的详细说明: 1. **什么是异常处理机制**: Java的异常处理机制是一种用于处理程序运行时错误的机制,它将原本需要程序员手动检查和处理的错误情况,转变为由系统自动检测和报告。当...
什么时间使用runtimeException,什么时间使用Exception,大家有没有被困扰到?经整理,JAVA异常处理框架,以及如何构造自己的异常体系,讲得比较详细,值得一看。
### Java异常处理详解 #### 异常的概念 异常在Java编程语言中指的是程序运行过程中遇到的非预期事件或状态,这些事件可能导致程序无法按照既定流程执行。异常并不等同于错误,它更多地指向那些虽然意外却可以预见并...
Java异常处理是编程中至关重要的一个环节,它确保了程序的稳定性和健壮性。异常是在程序执行过程中遇到的非正常情况,如果不妥善处理,可能导致Java虚拟机(JVM)的异常停止。Java通过异常类来表示不同类型的异常,...
Java 异常处理及应用 Java 异常处理是 Java 语言的核心组件之一,它是 Java 语言健壮性的一个重要体现。Java 把异常当作对象来处理,并定义一个基类 java.lang.Throwable 作为所有异常的超类。在 Java API 中已经...
Java异常处理是编程中至关重要的一个环节,它用于在程序执行期间处理错误和不正常的情况。本文深入探讨了高效Java异常处理框架,旨在提高代码的健壮性和稳定性。首先,文章介绍了异常的基本概念和Java异常体系结构。...
根据给定文件的信息,我们可以提炼出关于Java异常处理的一些关键知识点。尽管提供的内容与异常处理直接相关的部分较少,但基于标题、描述以及部分上下文,我们可以深入探讨Java异常处理的相关概念。 ### Java异常...
Java异常处理是编程中至关重要的一个环节,它确保了程序的稳定性和健壮性。异常是在程序执行过程中遇到的不正常情况,可能是由于输入错误、资源问题或是代码逻辑缺陷导致的。Java通过一套完整的异常处理机制来管理和...
为了更好地理解和应用Java异常处理机制,还需要了解以下几个关键概念: - **try-catch-finally块**:用于捕获和处理异常。`try`块包含可能抛出异常的代码,`catch`块用于处理特定类型的异常,而`finally`块则确保...
Java异常处理是编程中不可或缺的一部分,它为开发者提供了一种优雅的方式来处理程序运行时可能出现的错误情况。在Java中,异常被定义为程序执行期间发生的不正常情况,这些情况通常会导致程序中断。Java的设计者引入...