如果在一个方法体中抛出了异常,如何通知调用者?
声明异常
方法有两种:
方法1:调用者处理异常:通常在方法后面加throws Exception
方法2:调用者继续声明异常(下一个接收的人在处理)
public static void main(String[] args) throws Exception {
//divide()方法抛出的异常
divide();
}
}
自定义异常
除了系统自动抛出异常外,有些问题需要程序员自行抛出异常 (通过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(“性别必须是”男”或者”女”!");
}
}
}
实例:选择课程;提示选择课程代号1~3;要是输入的不是数字就会输出系统异常;要是输入的不是1 ~ 3的数字就会输出自定义的异常。
public class classP {
public static void main(String[] args) {
Scanner input= new Scanner(System.in);
System.out.println("输入课程代号(1到3之间的数组)");
try {
int i =input.nextInt();
//匹配输出的i
switch (i) {
case 1:
System.out.println("c#编程");
break;
case 2:
System.out.println("java编程");
break;
case 3:
System.out.println("C语言");
break;
default:
//自定义抛出异常:输入的数不在1~3之间时抛出
throw new Exception("请输入1到3之间的数");
}
} catch (Exception e) {
//出现异常时,追踪显示异常的位置和信息
e.printStackTrace();
//getMessage()方法输出的是printStackTrace()方法的一部分
//System.err.println(e.getMessage());
}finally {
//finally方法体中的代码一定会输出
System.out.println("程序结束了。");
}
}
}
正确结果为:
错误结果1:输入的不是数字
程序中的e.printStackTrace();追踪显示出错的地方还显示了错在第几行。
错误结果2:输入的不是在1~3之间的数字,抛出的就是自定义的异常。
若是有多种类型的异常匹配,则异常匹配的顺序
- 排列catch 语句的顺序:先子类后父类
- 发生异常时按顺序逐个匹配
- 只执行第一个与异常类型匹配的catch语句
代码形式:
public void method(){
try {
// 代码段
// 产生异常(异常类型2)
} catch (异常类型1 ex) {
// 对异常进行处理的代码段
} catch (异常类型2 ex) {
// 对异常进行处理的代码段
} catch (异常类型3 ex) {
// 对异常进行处理的代码段
}
// 代码段
}
图形显示: