- 1.try-catch
- (1)情况1
- (2)情况2
- (3)情况3
- (4)多重catch
- 2.try-catch-finally
- 3.throws
- 4.throw
- 5.自定义异常
- 6.原则问题
- 7.面试题
- (1)
- (2)
并不是编译错误
Java的异常处理是通过5个关键字来实现的:
try、catch、 finally、throw、throws
try块中所有语句正常执行完毕,不会发生异常,那么catch块中的所有语句都将会被忽略。
> public void method(){
> try {
> // 代码段(此处不会产生异常)
> }catch (异常类型 ex) {
> // 对异常进行处理的代码段
> }
> // 代码段
> }
(2)情况2
try语句块在执行中遇到异常,那么在try块中其余剩下的代码都将被忽略,系统会自动生成相应的异常对象,如果这个异常对象与catch中声明的异常类型相匹配,则相应的catch块将会被执行。
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
(3)情况3
try语句块在执行中遇到异常,如果这个异常对象与catch中声明的异常类型不匹配,程序会中断。
public void method(){
try {
// 代码段 1
// 产生异常的代码段2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
(4)多重catch
一段代码可能会引发多种类型的异常,而我们统一按照Exception类型捕获。
如果要分别捕获,就可以使用多重catch块。
引发多种类型的异常
1.排列catch 语句的顺序:先子类后父类
2.发生异常时按顺序逐个匹配
3.只执行第一个与异常类型匹配的catch语句
public void method(){
try {
// 代码段
// 产生异常(异常类型2)
} catch (异常类型1 ex) {
// 对异常进行处理的代码段
} catch (异常类型2 ex) {
// 对异常进行处理的代码段
} catch (异常类型3 ex) {
// 对异常进行处理的代码段
}
// 代码段
}
2.try-catch-finally
在try-catch块后加入finally块
是否发生异常都执行
不执行的唯情况
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
} catch (异常类型 ex) {
// 对异常进行处理的代码段3
return;
}finally{
// 代码段 4
}
}
3.throws
如果在一个方法体中抛出了异常,我们希望调用者能及时捕获异常,如何通知调用者?
1.Java语言中通过关键字throws声明某个方法可能抛出的各种异常。
2.throws可以同时声明多个异常,多个异常用逗号隔开。
如果把计算并输出商的任务封装在divide()方法中,并在方法的参数列表后通过throws声明了异常,然后在main()方法中调用该方法,此时main()方法就知道divide()方法中抛出了异常,可以采取以下两种方式进行处理。
方式1:调用者通过try-catch捕获并处理异常。
方式2:调用者通过throws继续声明异常。如果调用者不打算处理该异常,则可以继续通过throws声明异常,让上一级调用者处理异常。
main()方法声明的异常将由Java虚拟机来处理。
public class Test7 {
public static void divide() throws Exception,----,----,---- {
//可能出现异常的代码
}
public static void main(String[] args) {
try {
divide();
} catch (Exception e) {
e.printStackTrace();
}
}
// public static void main(String[] args) throws Exception {
// divide();
// }
}
4.throw
既然可以捕获到各种类型的异常,那么这些异常是在什么地方抛出的呢?
除了系统自动抛出异常外,在编程过程中,我们往往遇到这样的情形:有些问题是系统无法自动发现并解决的,如年龄不在正常范围内、性别输入不是“男”或“女”等,此时需要程序员而不是系统来自行抛出异常,把问题提交给调用者去解决。
Java语言中通过关键字throw来自行抛出异常
public class Person {
private String name = ""; // 姓名
private int age = 0; // 年龄
private String sex = "男"; // 性别
public void setSex(String sex) throws Exception {
if ("男".equals(sex) || "女".equals(sex))
this.sex = sex;
else {
throw new Exception(“性别必须是"男"或者"女"!");
}
}
}
5.自定义异常
当JDK 中的异常类型不能满足程序的需要时,可以自定义异常类。
使用自定义异常的步骤
7.面试题 (1)异常处理与性能
异常只能用于非正常情况
不要将过于庞大的代码块放在try中
在catch中指定具体的异常类型
需要对捕获的异常做处理
try-catch块中存在return语句,是否还执行finally块,如果执行,说出执行顺序?
try-catch- finally块中,finally块唯一不执行的情况是什么?
1、不管有没有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
请说出throw和throws的区别?
1.throw和throws的区别表现在以下三个方面 作用不同: throw用于在程序中抛出异常; throws用于声明在该方法内抛出了异常。
2.使用的位置不同:throw位于方法体内部,可以作为单独语句使用; throws必须跟在方法参数列表后面,不能单独使用。 内容不同:
3. throw抛出一个异常对象,而且只能是一个;throws后面跟异常类,而且可以跟多个异常类。



