Java异常处理及与C++的比较--异常分类.检验异常.非检验异常.常见异常
Java和C++一样,也有一些关键字用于处理异常。
注:以下2个示例只是为了尽可能把所有关键字都使用到,为了介绍关键字的使用位置,并不推荐以下做法。
C++中异常处理的关键字有:try.catch.throw,基本用法示例:
[cpp]
try
{
throw E;
}
catch (E e)
{
}
catch (...)
{
}
try
{
throw E;
}
catch (E e)
{
}
catch (...)
{
}
throw E抛出自己定义的异常,然后catch。catch(...)用于处理所有上面没有catch的异常。
Java中异常处理的关键字有:try.catch.finally.throw.throws,基本用法示例:
[java]
public void Err() throws E
{
try
{
...
}
catch (E e)
{
throw e;
}
finally
{
...
}
}
public void Err() throws E
{
try
{
...
}
catch (E e)
{
throw e;
}
finally
{
...
}
}
try.catch和C++类似,不过这里的catch没有catch(...),但是有finally块,这个块是try结束以后,不管是否有异常,不管异常是否被捕获,都会执行的一个块。
另外,throw用于抛出异常,throws用于说明函数可能抛出什么异常。
Java异常分类
Throwable--异常基类
Error--Throwable的子类,一般由虚拟机抛出,比较严重的错误,程序要做的是安全退出,其他的无能为力
Exception--Throwable的子类,一般是由程序引起的异常
RuntimeException--Exception的子类,运行时出现的异常,数组越界、空指针这一类的,一般可以通过修改程序来避免
非RuntimeException--Exception的子类,IOException之类的
检验异常与非检验异常
看到有些地方把这2个概念说的很绕口,我个人的理解是:
1.检验异常就是编译器会检验你是否catch了的异常,编译器会强制要求你写对应的catch语句,否则编译报错。这些异常一般都是方法后面带有throws的,就是说,方法说明了自己可能会抛出异常的。至于编译器为什么要这么做,也比较好理解,因为我一个方法,既然我已经预见到了可能会抛出异常,那么你就必须要处理一下,我都提醒你会出错了,你还不处理,那你这安的是什么心?除非检验异常以外的异常,都属于这一类。
2.非检验异常就是编译器不会去检验你是否catch的,比如像数组越界、空指针这一类的,编译器不会来管你。RuntimeException和Error属于这一类。
以上是个人理解,如果有误,还请各位指出,以便及时纠正,谢谢!
常见异常
ArrayIndexOfBoundsException--数组下标越界
ClassCastException-----------强制转换类失败
IllegalArgumentException-----参数异常
NullPointException-----------空指针异常
AssertionError---------------断言出错
ExceptionInInitializerError--初始化异常
StackOverflowError-----------栈溢出
补充:软件开发 , C++ ,