一、异常简介
在程序运行过程中,如果环境检测出一个不可以执行的操作,就会出现运行时错误。如果这个错误没有被处理,那么程序将会非正常终止。该如何处理这个异常,以使程序可以继续运行或者平稳终止呢?这就是下面要说到的异常处理。
警告:在这里有必要声明一下,异常处理需要初始化新的异常对象,需要从调用栈返回,而且还需要沿着方法调用链来传播异常以便找到它的异常处理器。所以,异常只有当必须处理不可预料的错误状况时我们才能使用它,不要用try-catch块处理简单的、可预料的情况。比如空指针这些都应该用if来代替。
二、异常类型
下面是Java1.6 API对异常类型的部分截图:
其中,RuntimeException类、Error类以及它们的子类都称为免检异常,所有其它异常都称为必检异常,意思是指编译器会强制程序员检查并处理它们。为避免过多地使用try-catch块,Java语言不允许编写代码捕获或声明免检异常。
1. Throwable类是所有异常类的根。所有的Java异常类都直接或者间接地继承自Throwable。
2. Error类扩展了Throwable类,描述的是内部系统错误,由Java虚拟机抛出,如果发生,除了通知用户以及尽量稳妥地终止程序外,几乎什么也不能做。
3. Exception类也扩展了Throwable类,它描述的是由程序和外部环境所引起的错误,这些错误能被程序捕获和处理。
4. RunTimeException类是Exception类的一个扩展,它描述的是程序设计错误,例如错误的类型转换,数组越界等。运行时异常通常由Java虚拟机抛出。
三、异常处理
1. 声明异常
程序中每个方法都必须声明它可能抛出的必检异常的类型,方法的调用者就必须去捕获该异常,这称为声明异常。语法如下:
public void myMethod() throws Exception1,Exception2{ ... }
如果方法抛出的是免检异常(Error异常和运行时异常)调用者也不会被编译器强制try/catch异常。如果方法在父类中没有声明异常,那么就不能在子类中对其进行覆盖来声明异常。
2. 抛出异常
检测一个错误的程序可以创建一个正确异常类型的实例并抛出它,这时catch()块将接手这个异常。这就称为抛出一个异常。通常,Java API中的每个异常类至少有两个构造方法,一个无参构造方法和一个带有可描述这个异常的String参数的构造方法,如下:
throw new Exception1();
throw new Exception1("message");
3. 捕获异常
当抛出一个异常时,可以在try-catch块中捕获并处理它,如下:
try{
...
}catch(Exception1 e1){
...
}catch(Exception2 e2){
...
}
从第一个到最后一个逐个检查catch块,判断在catch块中的异常类实例是否是该异常对象的类型。如果是,就将该异常对象赋值给所声明的变量,然后执行catch块中代码。如果没有发现异常处理器,Java会退出这个方法,把异常传递给调用这个方法的方法,继续同样的过程来查找处理器。如果在调用的过程中找不到处理器,程序就会终止并且在控制台上打印出错信息。
如果一个catch块可以捕获一个父类的异常对象,它就能捕获那个父类的所有子类的异常对象。注意,如果父类的catch块出现在子类的catch块之前就会导致编译出错。
4. 获取异常信息
Throwable类中提供了一些方法来获取异常对象的有价值的信息,如下:
public String getMessage() //返回这个对象的消息
public String toString() //返回异常类的命名+":"+getMessage()
public void printStackTrace() //在控制台打印Throwable对象以及它的调用栈的跟踪信息
public StackTraceElement[] getStackTrace() //返回栈跟踪构成的数组来表示这个可抛出的栈跟踪信息
5. finally子句
有时候无论异常中否出现或者中否被捕获,都希望执行某些代码,可利用finally子句来达到这个目的。
try{
...
}catch(Exception1 e1){
...
}finally{
...
}
注意,即使在到达finally块之前有一个return语句,finally块还是会执行。
6. 重新抛出异常
如果异常处理器没有处理某异常、或者处理器只是希望它的调用者注意到该异常,Java就允许异常处理器重新抛出该异常,此时调用者的其它处理器就会获得处理此异常的机会。
try{
...
}catch(Exception1 e1){
...
throw e1;
}
7. 链式异常
有时候,可能需要同原始异常一起抛出一个新异常(带有附加信息),这称为链式异常。
try{
...
}catch(Exception1 e1){
...
throw new Exception1("new exception", e1);
}
8. 创建自定义异常类
Java提供了相当多的异常类,尽量使用它们不要创建自己的异常类。如果遇到一个不能用预定义异常类恰当描述的问题,那我们就可以通过派生Exception类或其子类来创建自己的异常类。
public MyException extends Exception{
private String value;
public MyException(String value){
super("Value:" + value);
this.value = value;
}
public String getValue(){
return value;
}
}
throw new MyException("jiang");
提示,我们尽量不要去扩展RentimeException免检异常。
- 大小: 245.3 KB
分享到:
相关推荐
Java 异常处理习题 Java 异常处理是 Java 编程语言中的一种重要机制,用于处理程序在运行时可能出现的错误或异常情况。下面是关于 Java 异常处理的习题和知识点总结: 一、Java 异常处理关键字 * Java 中用来抛出...
java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理java异常处理
本文将从 Java 异常的基本概念和语法开始,讲述 Java 异常处理的基本知识,分析 Java 异常体系结构,对比 Spring 的异常处理框架,阐述异常处理的基本原则,并提出了自己处理一个大型应用系统异常的思想,并通过设计...
Java异常处理是编程中至关重要的一个环节,它允许开发者优雅地处理程序运行时可能出现的错误,确保程序的健壮性和稳定性。Java中的异常处理机制基于一个独特的概念——异常(Exception),这是一种表示程序运行中...
这个主题,"Java异常处理体系",涉及到Java如何优雅地处理程序运行时的异常,确保程序的健壮性和稳定性。这篇博文链接(已提供但无法直接访问)可能详细解释了Java异常处理的基本概念、机制以及最佳实践。 Java异常...
### 浅析JAVA异常处理机制 #### 一、Java异常处理机制概述 异常处理是Java语言中的一个重要机制,它能够确保程序在遇到不可预料的情况时仍能维持稳定运行。异常处理主要包括三个方面:捕获异常、控制程序流程以及...
Java异常处理是编程中至关重要的一个环节,它确保了程序在遇到错误时能够优雅地运行,而不是突然崩溃。本篇文章将深入探讨Java异常处理的概念、机制以及如何通过代码实例进行有效的异常管理。 Java异常处理的核心...
Java异常处理设计是Java编程中一个至关重要的环节,它直接影响到程序的稳定性和可维护性。在Java中,异常处理是通过try-catch-finally语句块来实现的,主要涉及两大类异常:编译时异常(Checked Exception)和运行时...
Java异常处理的9个最佳实践涵盖了开发者在进行Java编程时应当遵循的一系列规则和方法,以确保代码的健壮性和可维护性。异常处理是编程中的一个重要部分,它能够帮助我们更有效地管理和响应程序运行时的错误情况。 ...
Java异常处理是Java编程语言中的一个关键特性,它允许程序员优雅地处理程序运行时可能出现的错误和不正常状况。在Java中,异常是程序执行过程中出现的问题,它们中断了正常的控制流程,使得程序无法继续按照预期的...
Java异常处理是Java编程中一个至关重要的概念,它关乎到程序的健壮性和稳定性。在Java语言中,异常处理提供了一种机制,使得程序在遇到错误或非正常情况时能够优雅地处理问题,而不是突然崩溃。这个“java高端技术...
通过遵循上述最佳实践,开发者可以编写出更健壮、可维护的Java代码,有效地利用Java异常处理机制来提高程序的稳定性。同时,阅读并理解"Effective Java Exceptions"文档可以帮助进一步深化对Java异常处理的理解。
从给定的文件内容中可以看出,这是一系列Java程序示例,它们用来说明Java异常处理机制。异常处理是Java语言中一个非常重要的部分,它能够帮助程序在遇到错误情况时仍然可以正常运行或者优雅地退出。这些程序通过各种...
java异常练习题,北大青鸟学士后课后练习,主要是异常处理的小测验
以下是对Java异常处理的一些误区和经验总结。 **误区一:过度使用try-catch块** 有些开发者习惯于在每个函数的开始部分都套用try-catch块,以为这样可以捕捉所有可能出现的异常。实际上,这种做法使得代码变得混乱...
零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理零基础学Java异常处理...