异常处理概述:“异常”指的是程序运行时出现的非正常情况。 Java对异常的处理是面向对象的。即异常是一种对象,一个Java的Exception是一个描述异常情况的对象。
编程人员在编写程序的时候错误时不可避免的,一般来说,错误可分为编译错误和运行错误。 编译错误能够通过编译器检查出来,此时,程序不能继续运行。 运行错误是在程序运行过程中产生的错误 。
异常是方法代码运行时出现的非正常状态,这种非正常状态使程序无法或不能再正常继续往下运行,一些常见的异常包括:数组下标越界、除数为零、内存溢出、文件找不到、方法参数无效等。
Error类及其子类:表示普通程序很难恢复的异常。例如: NoClassDefFoundError(类定义没找到异常) OutOfMemoryError(内存越界异常) NoSuchMethodError(调用不存在的方法异常) 一般情况,这类异常比较少发生。 RuntimeException类及其子类:表示设计或实现方面的问题,例如: ArithmeticException(算术运算异常) ClassCastException(强制类型转换异常) NullPointerException(空引用异常) ArrayIndexOutOfBoundsException(数组下标越界异常) NumberFormatException(数字格式异常) 一般情况下,这类例外应尽量直接处理,而不要把它们传送给调用者处理。 Exception类及其非RuntimeException子类: 表示运行时因环境的影响而引发的异常,例如: IOException(输入输出异常)其子类包括:EOFException、FileNotFoundException、InterruptedIOException等。 InterruptedException(中断异常) 这类异常并非因设计或实现引起,是无法避免的。但一般情况下,程序员应该提供相应的代码捕捉和处理。
Java编译系统将所有的异常分为受检查的异常和不受检查的异常两大类,受检查异常要受到编译系统的检查。不受检查异常不受编译系统的检查。
处理异常分为以下两个步骤:
1. 抛出异常 在程序运行时当语义规则被违反时,将会抛出(throw)异常,即产生一个异常事件,生成一个异常对象。
2 .捕获异常 异常抛出后,异常对象提交给运行系统,系统就会从产生异常的代码处开始,沿着方法调用栈进行查找,直到找到包含相应处理的方法代码,并把异常对象交给该方法进行处理,这个过程成为捕获(catch)异常。
throw 关键字:
throw
关键字用于手动抛出异常。你可以使用throw
创建并抛出一个异常对象。- 通常,你会在方法中使用
throw
来通知调用者某些条件导致了一个异常。
引发ArithmeticException异常,throw
throws:
throws
关键字用于方法签名中,表示该方法可能抛出某些类型的异常。- 当一个方法使用
throws
声明了某些异常类型时,这意味着该方法中的代码可能会导致这些异常被抛出,调用此方法的代码需要处理这些异常或继续将它们传递。
public void myMethod() throws SomeException {
// method implementation
}
try-catch:
try-catch
块用于捕获和处理异常。你可以尝试执行可能引发异常的代码,并使用catch
块来捕获和处理这些异常。- 在
try
块中的代码执行期间,如果抛出了一个异常,那么catch
块会捕获并处理它。
try {
// code that may throw an exception
} catch (SomeException e) {
// handle the exception
}
finally:
finally
块用于执行不管是否出现异常都应该执行的代码,例如资源清理代码。- 无论
try
块中的代码是否抛出异常,finally
块中的代码都会被执行。 finally
常用于确保资源(如文件、数据库连接或网络连接)被正确关闭或释放。
class FinallyExample {
static void method(int i) {
try {
if (i == 2) {
System.out.println("第2种情况: 发生算术运算异常");
throw new ArithmeticException();
}
if (i == 3) {
System.out.println("第3种情况: 发生数字格式异常");
throw new NumberFormatException();
}
if (i == 4) {
System.out.println("第4种情况: 发生数组下标越界异常");
throw new ArrayIndexOutOfBoundsException();
}
System.out.println("第1种情况: 没有发生异常");
} catch (ArithmeticException e) {
System.out.println("异常被捕捉处理″");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("异常被捕捉,但又被重新引发");
throw e;
} finally {
System.out.println("这是finally句");
}
System.out.println("这一轮结束");
}
public static void main(String args[]) {
for (int i = 1; i < 5; i++) {
try {
method(i);
} catch (RuntimeException e) {
System.out.println("由main方法捕捉到异常");
}
}
}
}
当异常被抛出后,如果没有被处理,程序不会执行紧接着的代码,会向下寻找能够解决异常的方法,而跳过中间的代码!
自定义异常
除了Java系统提供的异常类外,我们还可以开发自己的异常类。这个工作实际上很简单,自定义异常往往会从Exception派生而来。
创建用户自定义异常的语法格式如下: class 自定义异常类名 extends 父类异常类名{类体 ;}
class MyException extends Exception {
public MyException(String msg) {
super(msg);
}
public MyException() {
this("My Exception");
}
}
//之后,我们可以使用自定义异常,如下所示。
public class ExceptionTest {
private static int i = 1;
public ExceptionTest() {
}
public static void main(java.lang.String[] arg) {
try {
a();
} catch (MyException e) {
System.out.println(e.getMessage());
}
}
private static void a() throws MyException {
int i = 0;
if (i < 10)
throw new MyException("new desc");
}
}