在Java中,异常(Exception)是指在程序执行过程中可能出现的错误或异常情况。Java通过异常类来表示这些异常情况,异常类是从java.lang.Exception
类继承的。异常类可以分为两大类:Checked异常和Unchecked异常。
Checked异常:检查异常
Checked异常是在编译时被检查的异常,即在代码编译阶段就需要处理这些异常,否则无法通过编译。这些异常通常表示程序可能出现的外部影响,需要程序员进行预防或处理。
Unchecked异常:运行时异常
Unchecked异常是在运行时才会被检查的异常,编译器不要求必须处理这些异常。这些异常通常表示程序内部错误或逻辑问题,应该通过代码的合理编写来避免。
在Java中,异常类形成了一个继承层级结构,java.lang.Throwable
是所有异常的基类,它有两个主要的子类:java.lang.Error
和java.lang.Exception
。Error
表示系统级别的错误,通常是不可恢复的,而Exception
则是可处理的异常。
异常处理的方式包括:
try
、catch
、finally
块来捕获和处理异常。throws
关键字声明方法可能抛出的异常,让调用者来处理。Exception
,以便处理特定的异常情况。以下是一个简单的Java异常处理示例:
public class ExceptionExample {
public static void main(String[] args) {
try {
int result = divide(10, 0);
System.out.println("Result: " + result);
} catch (ArithmeticException e) {
System.err.println("Error: Division by zero");
}
}
public static int divide(int a, int b) {
return a / b;
}
}
在这个示例中,divide
方法可能抛出ArithmeticException
,我们通过try
和catch
块捕获并处理这个异常。
以下是一些常见的异常类和它们的描述:
1. NullPointerException (运行时异常): 当尝试在一个对象引用上调用方法或访问属性,而该引用为null时抛出。
2. IllegalArgumentException (运行时异常): 当传递给方法的参数不合法或无效时抛出,例如传递了不允许的参数值。
3. IllegalStateException (运行时异常): 在对象的状态不适合于执行特定操作时抛出,例如在未初始化对象上调用方法。
4. ArrayIndexOutOfBoundsException (运行时异常): 当尝试访问数组中不存在的索引时抛出。
5. ArithmeticException (运行时异常): 在数学运算中出现错误时抛出,例如除以零。
6. ClassCastException (运行时异常): 当试图将一个对象转换为不兼容的类类型时抛出,例如将不是子类的对象转换为某个类的实例。
7. FileNotFoundException (检查异常): 在尝试打开一个不存在的文件时抛出。
8. IOException (检查异常): 处理输入输出操作可能出现的异常,例如读写文件、网络通信等。
9. SQLException (检查异常): 处理数据库访问异常。
10. InterruptedException (检查异常): 在多线程编程中,当一个线程在等待另一个线程执行某个操作时被中断时抛出。
11. NoSuchElementException (运行时异常): 当访问集合(如List、Set)中不存在的元素时抛出。
12. OutOfMemoryError (错误): 在程序尝试分配更多内存而可用内存不足时抛出,通常表示程序内存泄漏或者分配不当。
13. StackOverflowError (错误): 当递归调用层次过深,导致栈空间耗尽时抛出。
14. NumberFormatException (运行时异常): 当字符串不能转换为数字时抛出,例如使用Integer.parseInt()
方法时传递的字符串格式不正确。
简单代码示例
以下是一些Java中常见异常类的简单代码示例:
1. NullPointerException:
String str = null;
try {
int length = str.length(); // This will throw NullPointerException
} catch (NullPointerException e) {
System.out.println("NullPointerException caught: " + e.getMessage());
}
2. IllegalArgumentException:
int value = -5;
if (value < 0) {
throw new IllegalArgumentException("Value must be non-negative");
}
3. ArrayIndexOutOfBoundsException:
int[] numbers = {1, 2, 3};
try {
int value = numbers[5]; // This will throw ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("ArrayIndexOutOfBoundsException caught: " + e.getMessage());
}
4. FileNotFoundException:
try {
FileReader fileReader = new FileReader("myfile.txt"); // This will throw FileNotFoundException
} catch (FileNotFoundException e) {
System.out.println("FileNotFoundException caught: " + e.getMessage());
}
5. IOException:
try {
FileInputStream inputStream = new FileInputStream("file.txt");
// Perform I/O operations
inputStream.close();
} catch (IOException e) {
System.out.println("IOException caught: " + e.getMessage());
}
6. SQLException:
try {
// Code that interacts with a database
} catch (SQLException e) {
System.out.println("SQLException caught: " + e.getMessage());
}
7. InterruptedException:
try {
Thread.sleep(1000); // This will throw InterruptedException if the thread is interrupted while sleeping
} catch (InterruptedException e) {
System.out.println("InterruptedException caught: " + e.getMessage());
}
8. NumberFormatException:
String strNumber = "abc";
try {
int number = Integer.parseInt(strNumber); // This will throw NumberFormatException
} catch (NumberFormatException e) {
System.out.println("NumberFormatException caught: " + e.getMessage());
}