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;