跳到主要内容

Java 异常

异常指在程序运行中抛出的故障,而每个抛出的异常都会有自己专属的名称。

示例:java.lang.ArithmeticException(算数异常)

public int count(int j,int k) {
return j/k;
}
// 操作:k 传入 0
// 报错:Exception in thread "main" java.lang.ArithmeticException: / by zero

Java中的异常类体系是由 Throwable 类及其子类构成的一个类层次结构。Throwable 类是 Java 语言中所有错误或异常的根类,它是 Java 语言中错误或异常处理的基础,其子类分为两大类:Error 类和 Exception 类。

通常,程序员们在编写代码的时候,为了保证整个程序的健壮性,都会在可能出现异常的位置加入 try-catch 语句:

public int count(int j,int k) {
try {
return j/k;
}catch (Exception e) {
System.err.println("计算逻辑中出现了异常");
return -1;
}
}

异常处理的目的是为了保证程序的健壮性,也就是让程序具有更高的可靠性,在程序运行过程中,可能会遇到一些不可预料的问题,如系统资源紧张,设备故障等,如果程序没有处理这些异常,那么程序就会崩溃,无法正常运行,因此,程序员应该在代码中加入异常处理机制,以便在发生异常时,可以捕获并处理异常,并给出恰当的信息提示,以便程序能够正常运行,达到保证程序健壮性的目的。—— 异常处理的意义

异常捕获

try {
//要执行的代码
} catch(Exception e) {
//处理异常的代码
}

说明:

  • catch 块中的异常类型应该是精确的,不能使用父类的异常类型。比如,如果要捕获 IOException,就不能使用 Exception 类型,应该使用 IOException 类型
  • catch 块中只能捕获一种异常类型,不能捕获多种异常类型。如果要捕获多种异常类型,可以使用多个 catch 块(?)
  • 如果要捕获多个异常类型,那么 catch 块中的异常类型应该从小到大排列,这样可以避免子类异常被先捕获,而父类异常被后捕获的问题。

示例:

public void doSomething() {
try {
//执行一些代码
} catch(IOException e) {
//处理IOException异常 001
} catch(NullPointerException e) {
//处理NullPointerException异常 002
} catch(Exception e) {
//处理其他所有异常 003
} finally {
//不论是否发生异常,都要执行的代码 003
}
}

常见的异常

空指针异常(NullPointerException)

当程序试图在没有引用的对象上调用方法,或者试图访问或修改一个不存在的对象时,抛出此异常。

示例:

String str = null; 
System.out.println(str.length());

类型转换异常(ClassCastException)

当一个类型的对象转换成不兼容的类型时,抛出此异常。

示例:

 Object obj = new Object(); 
Integer i = (Integer)obj;

数组负下标异常(ArrayIndexOutOfBoundsException)

当程序试图访问一个数组中不存在的索引时,抛出该异常。

示例:

int[] arr = new int[5];
System.out.println(arr[-1]);

数学异常(ArithmeticException)

数学运算异常时抛出此异常。

示例:

int a = 1;
int b = 0;
int c = a/b;

算术异常(IllegalArgumentException)

当传递给方法的参数不合法时,抛出此异常。

示例:

public static void test(int i) {
if (i < 0) {
throw new IllegalArgumentException("参数不能小于0");
}
}

违反安全原则异常(SecurityException)

当一个程序违反安全原则时,抛出此异常。

示例:

System.setProperty("java.security.policy", "your_policy.policy"); 
System.setSecurityManager(new SecurityManager());

文件未找到异常(FileNotFoundException)

当程序尝试访问不存在的文件时,抛出此异常。

示例:

FileInputStream fis = new FileInputStream("abc.txt");

栈溢出异常(StackOverflowError)

当程序堆栈溢出时,抛出此异常。

示例:

public static void stackOverflow(){
stackOverflow();
}

字符串解析异常(NumberFormatException)

当程序试图将字符串转换成不支持的数字格式时,抛出此异常。

示例:

String str = "abc";
int i = Integer.parseInt(str);

运行时异常(RuntimeException)

所有可能在Java程序运行时发生的异常的基类.

示例:

int a = 1;
int b = 0;
int c = a/b;