目前的主流编程语言如C++、C#、Ruby、Python等,大都提供了异常处理机制。增加了异常处理机制后的程序有更好的容错性,更加健壮
Java语言语法体系是严密的,语法检查是严格的
Java不仅在编译时能检查所有的语法错误
而且在运行时能后捕获到所有的运行时错误
Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception
Java异常结构层次图:
Java异常分为以下两类:
1、Error
2、Exception
1、Error(错误)-- Java.lang.Error是错误类
指程序运行时遇到的硬件错误、操作系统的错误、其他软件错误或操作错误
错误对于程序而言是致命的,将导致程序无法运行,而且程序本身不能处理错误,只能依靠外界干预,否则会一直处于非正常状态
2、Exception(异常)
指在硬件和操作系统正常时,程序遇到的运行错。
异常对于程序而言是非致命的,虽然异常会导致程序非正常终止,但Java的异常处理机制使程序自身能够捕获和处理异常,由异常处理代码调整程序运行方向,使程序仍可继续运行
2、Exception(异常)
Java.lang.Exception是异常类,Exception对象是Java程序捕获和处理的对象。每一种异常对
应于Exception类的一个子类,异常对象中包含错误的位置和特征信息
非运行异常—指由程序运行环境错误引发的异常,这类异常必须捕获并处理,即编译 时异常
Exception类和Error类都是Throwable类的子类
java.lang.ArithmeticException(算术异常)
java.lang.NullPointerException(空指针异常)
java.lang.ArrayIndexoutofBoundsException(数组越级异常)
java.lang.SecurityException(安全异常)
java.lang.NegativeArraySizeException (数组大小为负)
java.lang.ClassCastException(类转换异常)
ClassNotFoundException(类未找到异常)
CloneNotSupportException(不支持克隆异常)
IllegalAccessException(未发获取异常)
InterruptedException (线程中断异常)
NoSuchMethodException(没有相应方法异常)
InstantiationException(实例化异常)
异常的捕获处理通过下面五个关键字实现 try – 表示试
试try代码块中的语句是否会产生异常
catch – 捕获,跟在try语句后,专门对try语句中抛出的异常进行处理
finally – 表示无论是否发生异常,finally语句必须执行
throw – 用来抛出一个异常
throws – 一般用在方法定义中,表示该方法会抛出异常
1.异常处理语句语法
try
{
语句1 //存在潜在异常的代码
}
catch(异常类 异常对象1 e1)
{ // 用于捕获并处理指定类型的异常对象,参数是一个异常对象e1,
其类型必须是Exception类及其子类。
语句2 //捕获到异常并进行处理的代码
}
catch(异常类 异常对象2 e2)
{ // 用于捕获并处理指定类型的异常对象,参数是一个异常对象e2,
其类型必须是Exception类及其子类。
语句2 //捕获到异常并进行处理的代码
}
finally //子句可以省略
{
语句3 //最后必须执行的代码,无论是否捕获到异常
}
2. try语句执行流程
2. try语句执行流程
(1) 正常情况下(即没有产生异常时)
(2) 捕获异常并处理
catch子句说明:
catch语句可以有多个,分别处理不同类的异常。
(2) 捕获异常并处理
注意:多个catch子句需要按异常类从子类到父类的次序依次排列。
2. try语句执行流程
(2) 捕获异常并处理
如果所有catch子句都没有捕获e,则e将由Java虚拟机捕获并处理,导致程序运行终止,就像没有使用try语句。
因此,通常最后一个catch子句的异常类参数声明为Exception,这样能够保证捕获和处理所
有异常对象。
(3) 执行finally子句
finally子句中的语句系列是最后必须执行的代码,无论是否产生异常。
3. 异常的抛出
任何Java代码都可以抛出异常,如:自己编写的代码、来自Java开发环境包中代码,或者Java运行时系统。无论是谁,都可以通过Java的throw语句抛出异常。从方法中抛出的任何异常都必须使用throws子句
1. throws抛出异常
如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws子句来声明抛出异常
throws语句用在方法定义时声明该方法要抛出的异常类型,如果抛出的是Exception异常类型,则该方法被声明为抛出所有的异常。多个异常可使用逗号分割
throws语句的语法格式为:
2. throw抛出异常
throw总是出现在函数体中,用来抛出一个Throwable类型的异常。程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块
例如: