异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,当我学习了Java异常机制后,才意识到从C开始,我就在使用异常机制了,知道如何去用if...else...来控制异常了,然而同一个异常或者错误如果多个地方出现,那么每个地方都要做相同处理,感觉相当的麻烦!因此基于OOP思想,Java语言在设计的当初就考虑到这些问题,提出了异常处理的框架的方案,所有的异常都可以用一个类型来表示,不同类型的异常对应不同的子类异常(这里的异常包括错误概念),定义异常处理的规范。
天有不测风云,人有旦夕祸福,Java的程序代码也如此。在编程过程中,首先应当尽可能去避免错误和异常发生,对于不可避免、不可预测的情况则在考虑发生异常时如何处理。
Java中的异常用对象来表示。Java对异常的处理是按异常分类处理的,不同异常有不同的分类,每种异常都对应一个类型(class),每个异常都对应一个异常类的对象。异常有两个来源,一是Java语言本身定义的一些基本异常类型,二是用户通过继承Exception类或者其子类自己定义的异常,即在方法体中,new一个Excption对象抛出。
异常的对象也有两个来源,一是Java运行时环境自动抛出系统生成的异常,而不管你是否愿意捕获和处理,它总要被抛出!比如创建文件时可能有不正确的路径的异常。二是程序员自己抛出的异常,这个异常可以是程序员自己定义的,也可以是Java语言中定义的,用throw 关键字抛出异常,这种异常常用来向调用者汇报异常的一些信息。异常是针对方法来说的,抛出、声明抛出、捕获和处理异常都是在方法中进行的。
Java异常处理通过5个关键字try、catch、throw、throws、finally进行管理。基本过程是用try语句块包住要监视的语句,如果在try语句块内出现异常,则异常会被抛出,你的代码在catch语句块中可以捕获到这个异常并做处理;还有以部分系统生成的异常在Java运行时自动抛出。你也可以通过throws关键字在方法上声明该方法要抛出异常,然后在方法内部通过throw抛出异常对象。finally语句块会在方法执行return之前执行,一般结构如下:
try{
程序代码//可能抛出异常,若没有抛出就执行,否则不执行
}catch(异常类型1 异常的变量名1){
程序代码//出现异常类型1时执行
}catch(异常类型2 异常的变量名2){
程序代码//出现异常类型2时执行
}finally{
程序代码//
}
注:异常的变量名表示抛出异常的对象的引用,如果catch捕获并匹配上了该异常,那么就可以直接用这个异常变量名,此时该异常变量名指向所匹配的异常,并且在catch代码块中可以直接引用。而finally语句在任何情况下都必须执行的代码,这样可以保证一些在任何情况下都必须执行代码的可靠性。
Java异常类类图
java.lang.Object
java.lang.Throwable
java.lang.Exception
java.lang.RuntimeException,IndexOutOfBoundsException...
java.lang.NullPointerException,ArrayIndexOutOfBoundsException...(列出常见的几个,分别对应上面列出的两个类)
java.lang.Error
java.lang.ThreadDeath,IOError...
1、Throwable
Throwable 类是 Java 语言中所有错误或异常的父类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。
2、Exception
Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件,表示程序本身可以处理的异常。
3、Error
Error 是 Throwable 的子类,表示仅靠程序本身无法恢复的严重错误,用于指示合理的应用程序不应该试图捕获的严重问题。
在执行该方法期间,无需在方法中通过throws声明可能抛出但没有捕获的 Error 的任何子类,因为Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try...catch语句捕获它,也没有用throws字句声明抛出它,还是会编译通过。
4、RuntimeException
RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的父类。Java编译器不去检查它,也就是说,当程序中可能出现这类异常时,即使没有用try...catch语句捕获它,也没有用throws字句声明抛出它,还是会编译通过,这种异常可以通过改进代码实现来避免。NullPointerException就是其子类之一,也是我们常遇到的异常之一。
5、ThreadDeath
调用 Thread 类中带有零参数的 stop 方法时,受害线程将抛出一个 ThreadDeath 实例。仅当应用程序在被异步终止后必须清除时才应该捕获这个类的实例。如果 ThreadDeath 被一个方法捕获,那么将它重新抛出非常重要,因为这样才能让该线程真正终止。如果没有捕获 ThreadDeath,则顶级错误处理程序不会输出消息。虽然 ThreadDeath 类是“正常出现”的,但它只能是 Error 的子类而不是 Exception 的子类,因为许多应用程序捕获所有出现的 Exception,然后又将其放弃。
现在了解了异常的一些基础,下面对于可能出现异常的代码,来谈谈两种处理办法:
第一、在方法中用try...catch语句捕获并处理异常,catach语句可以有多个,用来匹配多个异常。
第二、对于处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常。
大牛们说过,一个软件与其说是编写出来,不如说是调试出来的。如果每个方法都是简单的抛出异常,那么在方法调用方法的多层嵌套调用中,Java虚拟机会从出现异常的方法代码块中往回找,直到找到处理该异常的代码块为止。然后将异常交给相应的catch语句处理。如果Java虚拟机追溯到方法调用栈最底部main()方法时,如果仍然没有找到处理异常的代码块,将按照下面的步骤处理:(摘抄)
第一、调用异常的对象的printStackTrace()方法,打印方法调用栈的异常信息。
第二、如果出现异常的线程为主线程,则整个程序运行终止;如果非主线程,则终止该线程,其他线程继续运行。
通过分析思考可以看出,越早处理异常消耗的资源和时间越小,产生影响的范围也越小。因此,不要把自己能处理的异常也抛给调用者。
还有一点,不可忽视:finally语句是在任何情况下都必须执行的代码,这样保证了一些在任何情况下都必须执行代码的可靠性。所以finally语句块中不能通过给变量赋新值来改变return的返回值,也建议不要在finally块中使用return语句,没有意义还容易导致错误。
异常处理的语法规则:
第一、try语句不能单独存在,可以和catch、finally组成 try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个,try、catch、finally这三个关键字均不能单独使用。
第二、try、catch、finally三个代码块中变量的作用域分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。
第三、多个catch块时候,Java虚拟机会匹配其中一个异常类或其子类,就执行这个catch块,而不会再执行别的catch块。
第四、throw语句后不允许有紧跟其他语句,因为这些没有机会执行。
第五、如果一个方法调用了另外一个声明抛出异常的方法,那么这个方法要么处理异常,要么声明抛出。
而判断一个方法可能会出现异常,一般来说,在方法声明的时候用了throws语句,方法中有throw语句,方法调用的方法声明有throws关键字,并且如果在方法体中使用throw关键字抛出异常对象,在方法声明中就必须使用throws关键字声明。throw和throws关键字的区别:
throw用来抛出一个异常,在方法体内。语法格式为:throw 异常对象;
throws用来声明方法可能会抛出什么异常,在方法名后,语法格式为:throws 异常类型1,异常类型2...异常类型n.(异常类型必须为throw抛出异常对象的类型或其父类类型)
Java异常处理是Java语言的一大特色,也是个难点,掌握异常处理可以让写的代码更健壮和易于维护,所以应该认真的理解学习。
分享到:
相关推荐
第7章 java异常处理
Java 异常处理习题 Java 异常处理是 Java 编程语言中的一种重要机制,用于处理程序在运行时可能出现的错误或异常情况。下面是关于 Java 异常处理的习题和知识点总结: 一、Java 异常处理关键字 * Java 中用来抛出...
java 全局异常java 全局异常java 全局异常java 全局异常 java 全局异常java 全局异常java 全局异常java 全局异常 java 全局异常java 全局异常java 全局异常java 全局异常 java 全局异常java 全局异常java 全局异常...
java 基础异常 java 基础异常java 基础异常java 基础异常java 基础异常 java 基础异常java 基础异常java 基础异常java 基础异常 java 基础异常java 基础异常java 基础异常java 基础异常 java 基础异常java 基础异常...
Java 异常详解 Java 异常是指在程序运行中出现的违背指定正常流向的事件。异常可以分为两大类:-checked 异常和 unchecked 异常。Checked 异常必须在编译时捕捉并处理,而 unchecked 异常可以在编译时忽略,但是在...
其中,使用Java异常处理机制实现全局异常统一处理是最常见的方式。 在Java异常处理机制中,当一个方法抛出异常时,该异常将被传递到调用该方法的方法中,直到找到能够处理该异常的代码为止。在这个过程中,Java使用...
当堆空间不足时,会抛出`java.lang.OutOfMemoryError: Java heap space`异常。为了优化内存管理,Java采用了垃圾回收机制(Garbage Collection),自动回收不再使用的对象,以避免内存泄漏。 2. **Method Area...
Java异常处理是编程中至关重要的一个环节,它关乎程序的健壮性和稳定性。在Java中,异常(Exception)被用来表示程序运行时发生的错误或不正常情况。异常并不等同于错误,它是程序设计的一部分,允许我们优雅地处理...
Java异常处理是编程中至关重要的一个环节,它确保了程序在遇到错误情况时能够优雅地进行错误恢复或者至少提供有用的错误信息。Java异常是程序在运行时遇到的问题,例如数组越界、空指针异常、文件未找到等,这些问题...
为了更好地理解和处理这些异常,本文将详细介绍几种常见的Java异常类型及其处理方法。 #### 1. `java.lang.NullPointerException` - **异常概述**:`NullPointerException`是Java中最常见的运行时异常之一,它发生...
自己编写异常类型 ,自定义错误异常进行全局捕捉。实现项目全局的拦截定义输出。。。
java 业务异常 java 业务异常java 业务异常 java 业务异常java 业务异常 java 业务异常java 业务异常 java 业务异常java 业务异常 java 业务异常java 业务异常 java 业务异常
其中异常类 Exception 又分为运行时异常(RuntimeException)和非运行时异常,这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。 二、异常的捕获和处理 Java ...
java异常练习题,北大青鸟学士后课后练习,主要是异常处理的小测验
Java异常机制可以保证程序更安全和更健壮。虽说Java类库已经提供很多可以直接处理异常的类,但是有时候为了更加地捕获和处理异常以呈现更好的用户体验,需要开发者自定义异常。本文是探讨如何自定义异常以及使用...
Java自定义异常处理详细介绍,包括了很多比较经典的案例,可以自己研究自定义异常
以下是关于Java异常处理机制的详细说明: 1. **什么是异常处理机制**: Java的异常处理机制是一种用于处理程序运行时错误的机制,它将原本需要程序员手动检查和处理的错误情况,转变为由系统自动检测和报告。当...
Java 异常机制的基础知识包括异常的基础概念、异常的分类、异常的对象、异常的来源、异常的处理等几个方面。 一、Java 异常的基础知识 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以...
Java异常处理是编程中至关重要的一个环节,它帮助开发者识别并修复程序运行时可能出现的问题。在面试中,对Java异常的熟悉程度往往被视为衡量开发者经验和技术水平的重要标准。以下是一些Java常见异常的详细解析: ...