当JAVA程序违反了JAVA的语义规则时,JAVA 虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发 IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是 java.lang.Thowable的子类。
在C++和Java中,异常处理机制是用于处理程序运行期间可能发生的异常情况的一种手段。当这些异常情况(通常称为异常)发生时,程序的控制流会被立即转向一个特定的代码块,该代码块负责处理该异常。
C++中的异常处理
在C++中,异常处理主要通过try、catch和throw三个关键字来实现。
原理:
throw语句用于抛出异常。
try块用于包含可能会抛出异常的代码。
catch块用于捕获并处理异常。
例子:
cpp
#include <iostream>
#include <stdexcept>
void divide(int a, int b) {
if (b == 0) {
throw std::runtime_error("Division by zero condition!");
}
std::cout << a / b << std::endl;
}
int main() {
try {
divide(10, 0); // 这里会抛出异常
}
catch (const std::runtime_error& e) {
std::cerr << "Caught an exception: " << e.what() << std::endl;
}
return 0;
}
Java中的异常处理
在Java中,异常处理也是通过try、catch和throw(以及finally和throws)来实现的。
原理:
throw语句用于抛出异常。
try块用于包含可能会抛出异常的代码。
catch块用于捕获并处理异常。
finally块(可选)无论是否发生异常都会被执行,通常用于清理资源。
如果方法内部可能抛出异常但不在当前方法中进行处理,可以在方法声明后使用throws关键字来声明可能抛出的异常。
例子:
java
public class ExceptionDemo {
public static void divide(int a, int b) throws ArithmeticException {
if (b == 0) {
throw new ArithmeticException("Division by zero condition!");
}
System.out.println(a / b);
}
public static void main(String[] args) {
try {
divide(10, 0); // 这里会抛出异常
}
catch (ArithmeticException e) {
System.err.println("Caught an exception: " + e.getMessage());
}
}
}
在上面的Java例子中,我们使用了throws关键字在divide方法的声明中声明了可能抛出的ArithmeticException异常,并在main方法中通过try-catch块来捕获和处理这个异常。