在Java中,RuntimeException
是所有未检查异常(Unchecked Exception)的基类,未检查异常不需要显式地捕获或声明在方法签名中。以下是10个最常见的RuntimeException
子类:
-
NullPointerException
- 当应用程序试图在需要对象的地方使用
null
时,抛出该异常。 - 例如,调用一个空对象的方法,访问空对象的字段等。
String str = null; str.length(); // 抛出 NullPointerException
- 当应用程序试图在需要对象的地方使用
-
ArrayIndexOutOfBoundsException
- 当试图用非法索引访问数组时,抛出该异常。索引是负数或大于等于数组的大小。
int[] array = new int[5]; int value = array[5]; // 抛出 ArrayIndexOutOfBoundsException
-
ArithmeticException
- 当出现算术错误时,抛出该异常。例如,除以零。
int result = 10 / 0; // 抛出 ArithmeticException
-
ClassCastException
- 当试图将对象强制转换为不是实例的子类时,抛出该异常。
Object x = new Integer(0); String s = (String) x; // 抛出 ClassCastException
-
IllegalArgumentException
- 当向方法传递了非法或不适当的参数时,抛出该异常。
Thread.sleep(-1); // 抛出 IllegalArgumentException
-
NumberFormatException
- 当试图将字符串解析为数字,但字符串不包含可解析的格式时,抛出该异常。
NumberFormatException
是IllegalArgumentException
的子类。
int num = Integer.parseInt("abc"); // 抛出 NumberFormatException
- 当试图将字符串解析为数字,但字符串不包含可解析的格式时,抛出该异常。
-
IndexOutOfBoundsException
- 当索引值超出某个序列的边界时(例如列表、字符串或数组),抛出该异常。它有几个子类,如
ArrayIndexOutOfBoundsException
和StringIndexOutOfBoundsException
。
String str = "hello"; char ch = str.charAt(5); // 抛出 StringIndexOutOfBoundsException
- 当索引值超出某个序列的边界时(例如列表、字符串或数组),抛出该异常。它有几个子类,如
-
UnsupportedOperationException
- 当试图执行不支持的操作时,抛出该异常。通常在集合框架中,当某个操作不被实现时会抛出。
List<String> list = Arrays.asList("a", "b", "c"); list.add("d"); // 抛出 UnsupportedOperationException
-
IllegalStateException
- 当方法被调用的时机不对或环境不合适时,抛出该异常。
Iterator<String> iterator = new ArrayList<String>().iterator(); iterator.remove(); // 抛出 IllegalStateException
-
ConcurrentModificationException
- 当检测到对象被并发修改,但不允许这种修改时,抛出该异常。通常在迭代集合时,如果在迭代过程中对集合进行了修改,会抛出该异常。
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
for (String s : list) {
if (s.equals("a")) {
list.remove(s); // 抛出 ConcurrentModificationException
}
}
了解这些常见的RuntimeException
及其发生的情境,可以帮助开发者编写更健壮和容错的代码。