1.异常对象生成(抛出异常)
Java程序的执行过程中如果出现异常,就会生成一个异常类的对象,该异常对象将会被提交给Java运行时系统。
-
虚拟机自动生成异常对象:虚拟机检测到程序发生了问题,在后台自动创建异常对象,并交给Java运行时系统(抛出)。
-
开发人员手动创建异常对象:
Exception exception = new ClassCastException();
可以不交给Java运行时系统(不抛出)。就是一个普通对象。
2.处理异常对象(捕获异常catch)
方法2内抛出异常 -> 抛给调用的方法1->...直到被处理
void method1(){
method2();
}
void method2(){
System.out.println("产生异常");
}
如果抛到main()方法,并且main也不处理,则程序运行终止。
3.try-catch-finally
(1)try
把可能出现异常的代码用try括起来
(2)catch
捕获到ClassCastException异常,异常对象名为e。括号内是处理该异常。
可以写多个catch,参数可以是ClassCastException,也可以是它的父类。
异常对象e可以调用成员变量和方法
常用方法
getMessage()
获取异常信息,返回字符串。
printStackTrace()
获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void。
catch (ClassCastException e) {
e.printStackTrace(); //控制台显示异常
System.out.println(e.getMessage()); //java.lang.Object cannot be cast to java.lang.String
}
(3)finally
finally是可选的,最后执行的代码。
不论是否有异常,不论catch语句中是否有return,finally块中的语句都会被执行。
如果catch中有return,则先执行finally块中代码,再返回catch中的return。
如果catch和finally中都有return,catch中的return会执行(表达式)不会返回,只返回finally中的return。
public void talk(String word) {
System.out.println(word);
try {
Object o = new Object();
String str = (String) o;
} catch (IndexOutOfBoundsException e) {
System.out.println("处理数组下标越界异常");
} catch (ClassCastException e) {
System.out.println("处理类型转换异常");
} catch (NullPointerException e) {
System.out.println("处理空指针异常");
} finally {
System.out.println("你写错代码了");
}
word += "~";
}
执行结果
English
处理类型转换异常
你写错代码了
1.catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面。否则,报错。小的写在上面。
2.try-catch-finally结构可以嵌套