一、在Java中,常见的运行时异常(RuntimeException)包括以下几种:
- NullPointerException:当应用程序试图访问空对象时,会抛出此异常。简单地说,就是调用了未经初始化的对象或者是不存在的对象。
- ArrayIndexOutOfBoundsException(下标越界异常):当访问数组的索引超出范围时,会抛出此异常。
- ClassCastException(类转换异常):当试图将一个对象强制转换为不兼容的类时,会抛出此异常。
- IllegalArgumentException(非法参数异常):当向方法传递不合法的参数时,会抛出此异常。
- ArithmeticException(算术异常):当在算术运算中发生错误时,例如除以零,会抛出此异常。
- UnsupportedOperationException(不支持的操作异常):当调用一个不支持的方法或操作时,会抛出此异常。
- ConcurrentModificationException(并发修改异常):当在迭代集合对象的过程中,使用了不允许的修改操作时,会抛出此异常。
- NumberFormatException(数字格式异常):当试图将一个字符串转换为数字,但该字符串的格式不正确时,会抛出此异常。
- SecurityException(安全异常):由安全管理器抛出的异常,指示存在安全侵犯。
此外,还有其他的运行时异常,如InstantiationException
(实例化异常,当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出)、StackOverflowError
(堆栈溢出错误,当一个应用递归调用的层次太深而导致堆栈溢出时抛出)等。
请注意,以上列举的异常并非全部,Java中还有许多其他的运行时异常。当编写Java程序时,应当熟悉这些异常,并学会如何正确地处理它们,以提高程序的健壮性和稳定性。
二、在Java中,捕获和处理异常通常使用try-catch
块。当你预计某段代码可能会抛出异常时,你可以将这段代码放在try
块中,并在catch
块中处理这个异常。以下是一个简单的示例,展示了如何捕获和处理异常:
public class ExceptionHandlingExample { | |
public static void main(String[] args) { | |
try { | |
// 可能会抛出异常的代码 | |
int result = 10 / 0; // 这会抛出ArithmeticException | |
} catch (ArithmeticException e) { | |
// 处理ArithmeticException异常的代码 | |
System.out.println("捕获到算术异常: " + e.getMessage()); | |
} catch (Exception e) { | |
// 处理其他类型异常的代码(可选) | |
// 注意:通常不建议捕获所有异常(Exception),除非你确实打算处理所有类型的异常 | |
System.out.println("捕获到异常: " + e.getMessage()); | |
e.printStackTrace(); // 打印异常的堆栈跟踪信息 | |
} finally { | |
// 无论是否发生异常都会执行的代码(可选) | |
System.out.println("finally块中的代码,无论是否发生异常都会执行"); | |
} | |
} | |
} |
在这个示例中,我们尝试执行一个会导致ArithmeticException
的除法操作(除以0)。这个操作被放在try
块中,因此如果发生异常,控制流将转移到相应的catch
块。在这个例子中,我们有一个专门捕获ArithmeticException
的catch
块,它会打印出一条错误消息。
如果try
块中的代码抛出了其他类型的异常(在这个示例中没有),并且没有相应的catch
块来捕获它,那么异常将会继续向上传播,直到找到一个能够处理它的catch
块,或者如果没有找到,那么程序将会终止并打印出异常的堆栈跟踪信息。
finally
块是可选的,它包含的代码无论是否发生异常都会执行。这通常用于执行清理操作,如关闭文件或网络连接。注意,如果在try
或catch
块中使用了return
、break
或continue
语句,那么finally
块仍然会执行,但finally
块之后的代码(如果有的话)可能不会执行。
另外,还可以使用throw
语句手动抛出异常。这在需要向调用者指示某个错误条件时非常有用。例如:
java复制代码
if (someCondition) { | |
throw new IllegalArgumentException("参数不合法"); | |
} |
在这个例子中,如果someCondition
为真,那么就会抛出一个IllegalArgumentException
,调用者必须处理这个异常(除非它在另一个try-catch
块中)。