Java学习笔记:Java的异常机制
两种处理方法:
- try-catch
- throws
throws抛出的异常必须是throwable的子类
try-catch语句
try
{
语句1;//如果语句1有异常,则语句2不会执行,直接到catch
语句2;
//放入可能异常的句子
}
catch(Exception e) //catch (错误类型 + 对象),
{ //错误类型一般写Exception就可以了,因为Exception是其他错误类型的父类
//处理或者提醒用户的句子
}
//可以捕捉多个异常
catch(异常类型1 e)
{
//...
}
catch(异常类型2 e)
{
//...
}
...
finally
{
//无论是否捕捉到,都一定会执行的代码
//一般用于关闭文件,删除临时文件等资源的清理工作
}
上面程序中,所有的catch(){} 只有一个catch被执行 或者 都不执行
catch与catch之间不能有代码。
- 注意事项
先catch子类异常,后catch父类异常,反之编译报错,因为父类异常里就包括所有子类异常。
class A extends Exception {
}
class B extends A {
}
class C extends B {
}
class M {
public void compare(int i, int j) throws A, B {
if (i > j)
throw new A();
else
throw new B();
}
}
public class TestTryCatch {
public static void main(String[] args) {
M mm = new M();
try {
mm.compare(-4, 1);
} catch (B bb) {
System.out.println("左边不能小于右边");
} catch (A aa) {
System.out.println("左边不能大于右边");
}
}
}
子类重写了基类方法时,子类方法抛出异常的范围不能大于基类方法抛出的异常范围
子类方法可以不抛出异常,也可以只抛出基类方法的部分异常,但不可以抛出基类方法以外的异常
//自定义异常A
class A extends Exception
{
}
//自定义异常B
class B extends Exception
{
}
//自定义异常C
class C extends Exception
{
}
class M
{
void f() throws A, B
{
}
}
class N extends M
{
//可以throws A或B,也可以throws A,B 也可以不throws,
//但不可以throws C 即"子类覆盖了基类方法时,
//子类方法抛出异常的范围不能大于基类方法抛出的异常范围"
void f() throws A,B
{
}
}
class Test
{
public static void main(String[] args)
{
M m = new M();
N n = new N();
System.out.println("1111");
}
}
-
异常的处理机总结
1.Java程序运行出错时,系统先自动检测错误,并立刻生成一个与该错误对应的异常对象。
2.然后将该异常对象提供给JVM。
3.JVM会先找相应的代码来处理该异常,若没找到,则由JVM做些简单处理后,程序被强行终止。
4.程序员可以自己编写代码捕捉并处理相应异常. -
补充:
try
{
//...
}
catch(Exception e)
{
e.printStackTrace();
}
printStackTrace
将错误对象e在堆栈中发生的错误信息及路径打印出来(即打印出错误信息)