欢迎转载,如果转载请注明出处!!!
教学代码看这里!!!MyInsCode-CSDN博客
一、前言
由于Java安全性,Java语言需要对Java程序中可能出现的运行错误进行处理。作为一门面向对象的语言,Java采取了将运行错误进行封装,对其处理。
在Java中运行错误被分为两类:错误和异常
二、简介
1、错误(Error)
错误(Error)是程序运行时遇到的硬件错误,或操作系统、虚拟机等系统软件错误,或者操作错误。简而言之,错误是致命的,非程序编写错误。
java.lang.Error是错误类,产生错误需要JVM抛出异常。主要错误类如下:
NoClassDefFoundError类:没有找到.class文件时,运行没有main()方法的.class类抛出 OutOfMemoryError类:new申请内存而没有可分配内存时抛出 StackOverflowError类:递归函数不能正常结束时抛出
2、异常(Exception)
异常(Exception)是在硬件和系统软件运行正常时,程序产生运行错误。例如除数为0,网络连接中断,数据库连接中断,操作数越界。
Exception类一般代表程序设计或实现方面的问题。Exception对象是Java程序捕获和处理的对象。异常对象中包含错误的位置和特征信息。
异常对程序而言是非致命的,异常处理机制捕获和处理异常,由异常处理代码进行调整。主要异常类又可分为两类,如下:
(1)运行时异常(未检测异常)RuntimeException(unchecked exception):
运行时异常(RuntimeException)又叫做未检测异常(unchecked exception);由程序本身错误引发的;程序设计时大多可以避免。只要程序设计没有问题都不会产生,对这些异常一般不做处理,以便问题能自然暴露出来。换言之,运行时异常一般不用处理,是程序代码本身书写正确与否的问题。主要类如下:
算术异常(ArithmeticException);
空对象异常(NullPointerException);
类型强制转换异常(ClassCastException);
序号越界异常(IndexOutOfBoundsException);
数组下标越界异常(ArraysIndexOutOfBoundsException),
字符串序号越界异常(StringIndexOutOfBoundsException),
(2)检测异常(非运行异常)checked exception(IOException、SQLException):
检测异常(checked exception)又叫做非运行异常(IOException、SQLException);由程序运行环境错误引发的;这类异常必须捕获并处理。例如,IOException类代表输入输出操作产生的异常。这些异常一般是由用户环境而非程序本身问题造成的,JDK中一般强制调用者在使用时作处理。总之,检测异常必须捕获处理。举例如下:
ChangedCharSetException,
CharacterCodingException,
CharConversionException,
ClosedChannelException,
EOFException,
FileLockInterruptionException,
FileNotFoundException,
FilerException,
三、异常处理措施
1、try-catch-finally语句
Java提供了try-catch-finally语句来捕获和处理一个或多个异常。
※catch语句的顺序:
可以有多重catch块,捕获顺序是按照次序依次进行匹配,一旦匹配成功,后面的catch块将不再进行匹配。因此,catch块的异常类顺序是由子类到父类。
※try-catch-finally语句执行顺序:
@1:如果没有异常,执行try块中语句,再执行finally块中语句,再执行finally块后的语句。
@2:如果有异常:执行至异常处,跳过剩余try语句,执行对应catch块的语句,再执行finally语句块,再执行finally语句块后面的代码。
2、抛出异常
(1)抛出异常对象的throw语句
一个异常对象可以由Java虚拟机抛出,也可以由程序主动抛出。如果程序中存在逻辑错误但不是Java的异常,程序也可以采用throw语句主动抛出一个异常对象。
格式:throw 异常对象的实例
public void setMonth(int month)
{
if (month<1||month>12)
throw new exception(“月份错误”);
}
throw抛出的异常对象需要try语句捕获并处理,抛出和处理语句可以在同一方法中,也可以在不同方法中。
(2)方法声明抛出异常的throws子句
一个方法产生的异常可以抛出给方法调用者进行处理,实现逐级传递。
格式:返回类型 方法名(形参列表) [throws 异常类]
方法抛出的异常类是throws子句中的指定的异常类或者其子类
3、自定义类异常
@用户自定义的异常类必须继承Exception类
在恰当时候进行异常的抛出或者捕获处理。
※注意:
子类中覆盖的方法抛出的异常不能比父类被覆盖的方法抛出更多的异常。
try-catch-finally语句中catch可以省略,或者finally省略,但不可同时省略。
Throwable类是Exception和Error的直接父类,Throwable是所有异常类的父类。
finally 中的内容总会执行到,甚至当try中执行到return语句,也会先将finally执行完,再返回执行return。除了一种情况:程序执行到System.exit(),这时程序会立刻退出。