上一篇地址:整理好了!2024年最常见 100 道 Java基础面试题(十六)-CSDN博客
三十三、Java 中常见的异常有哪些?
Java中常见的异常很多,它们主要分为两大类:受检查异常(Checked Exceptions)和不受检查异常(Unchecked Exceptions)。此外,还有一些错误(Errors)也是程序运行时可能遇到的。下面是一些具体的示例:
受检查异常(Checked Exceptions)
这些异常继承自java.lang.Exception
类,但不是RuntimeException
的子类。它们在方法中必须被捕获或声明抛出:
IOException
- 输入输出操作异常。SQLException
- 数据库操作异常。FileNotFoundException
- 文件未找到异常。MalformedURLException
- URL格式错误异常。
不受检查异常(Unchecked Exceptions)
这些异常继承自java.lang.RuntimeException
类,它们通常是编程错误,不需要强制捕获:
NullPointerException
- 尝试使用null
引用进行操作。IllegalArgumentException
- 传递给方法的参数不合法。ArrayIndexOutOfBoundsException
- 数组索引越界。ArithmeticException
- 算术运算异常,如除以零。NumberFormatException
- 字符串转换为数字格式错误。
错误(Errors)
错误不是异常,它们是java.lang.Error
的子类,表示JVM本身的错误或严重问题,通常是不可恢复的:
OutOfMemoryError
- 内存溢出错误。StackOverflowError
- 栈溢出错误。VirtualMachineError
- 虚拟机错误,如系统退出或致命错误。AssertionError
- 断言失败错误。
其他异常
还有一些其他的异常和错误,如InterruptedException
(线程中断异常)、ClassNotFoundException
(类未找到异常)和InstantiationException
(实例化异常)等。
示例
try {
// 可能会抛出IOException
FileReader fileReader = new FileReader("file.txt");
} catch (IOException e) {
e.printStackTrace();
}
try {
// 可能会抛出NullPointerException
String str = null;
int length = str.length();
} catch (NullPointerException e) {
e.printStackTrace();
}
try {
// 可能会抛出OutOfMemoryError
List<String> list = new ArrayList<>();
while (true) {
list.add(new String("Infinite loop"));
}
} catch (OutOfMemoryError e) {
e.printStackTrace();
}
在这个示例中,IOException
是一个受检查异常,必须被捕获或声明抛出;NullPointerException
是一个不受检查异常,通常不需要显式捕获;OutOfMemoryError
是一个错误,表示JVM的内存不足,通常是不可恢复的。
总结
了解Java中常见的异常对于编写健壮的程序非常重要。合理地使用异常处理可以提高程序的稳定性和可维护性。同时,应该避免滥用异常,例如,不应该使用异常来控制正常的程序流程。
三十四、Java 中常见的运行时异常有哪些?
在Java中,运行时异常(RuntimeException)是一类继承自java.lang.RuntimeException
的异常。这些异常通常是由于编程错误导致的,比如违反了程序的预期状态。与受检查异常不同,运行时异常不需要在方法调用时被捕获或声明抛出,但最佳实践推荐尽可能捕获它们以避免程序的异常终止。
以下是一些Java中常见的运行时异常:
-
NullPointerException
- 当应用程序尝试使用null
引用进行操作时,如访问对象的方法或属性。 -
IllegalArgumentException
- 当方法接收到不正确的参数时,如传递给一个需要有效参数的方法一个null
或不合法的值。 -
IllegalStateException
- 当对象处于一个不合法或不期望的状态时,抛出此异常。 -
IndexOutOfBoundsException
- 访问数组或字符串时,索引超出范围。 -
ArrayStoreException
- 尝试将不兼容的类型的对象存储到一个对象数组中。 -
ClassCastException
- 类型转换错误,尝试将对象实例强制转换为不兼容的类型。 -
ArithmeticException
- 算术运算异常,如除以零。 -
NumberFormatException
- 当尝试将字符串转换为数值类型,但该字符串不符合相应的格式时。 -
NegativeArraySizeException
- 在创建数组时,如果数组的大小是负数,则会抛出此异常。 -
UnsupportedOperationException
- 当不支持请求的操作时,抛出此异常。 -
IllegalThreadStateException
- 当线程不是处于请求的状态时,抛出此异常。 -
ConcurrentModificationException
- 当一个迭代器检测到它正在遍历的集合在迭代期间被修改时。
示例
public class RuntimeExceptionExample {
public static void main(String[] args) {
String str = null;
try {
int length = str.length(); // 这里会抛出NullPointerException
} catch (NullPointerException e) {
System.out.println("Caught NullPointerException: " + e.getMessage());
}
int[] numbers = new int[5];
try {
System.out.println(numbers[10]); // 这里会抛出IndexOutOfBoundsException
} catch (IndexOutOfBoundsException e) {
System.out.println("Caught IndexOutOfBoundsException: " + e.getMessage());
}
}
}
在这个示例中,尝试访问一个null
字符串的长度会抛出NullPointerException
,而访问数组的一个不存在的索引会抛出IndexOutOfBoundsException
。
总结
运行时异常是程序运行时可能遇到的异常,它们通常是由于编程错误导致的。尽管Java编译器不强制处理这些异常,但正确处理这些异常对于防止程序崩溃和提供健壮的程序行为至关重要。开发者应该在可能的情况下捕获并处理这些异常,或者通过文档(如方法的JavaDoc)明确它们的存在,使调用者知道需要处理。