使用异常处理程序错误
目标:掌握Java的异常处理机制
1、运用 try 、catch 、 finally 处理异常
2、运用 throw 抛出异常
3、运用 throws 声明异常
程序中的异常
public class HelloAndroid {
public static void main(String[] args) {
System.out.print("请输入课程代号(1至3之间的数字):");
Scanner in = new Scanner(System.in);
int courseCode = in.nextInt(); // 从键盘输入整数
switch (courseCode) {
case 1:
System.out.println("C#编程");
break;
case 2:
System.out.println("Java编程");
break;
case 3:
System.out.println("SQL基础");
}
}
}
正常情况:
输入:2
输出:Java编程
异常情况:
输入:B
程序中断运行!
什么是异常?
异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。
什么是异常处理?
Java编程语言使用异常处理机制为程序提供了错误处理的能力。
程序中预先想好了对付异常的处理办法->程序运行->异常!->对异常进行处理->处理完毕,程序继续运行
Java中如何进行异常处理
Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws
捕获异常:try:执行可能产生异常的代码;
catch:捕获异常
finally:无论是否发生异常,代码总能执行
抛出异常:throw:手动抛出异常
声明异常:声明方法可能要抛出的各种异常
try/catch块
使用try/catch块捕获异常,分为三种情况:
1、第一种情况:
public void method(){
try {
// 代码段(此处不会产生异常)
} catch (异常类型 ex) {
// 对异常进行处理的代码段
}
// 代码段
}
public class AccpException {
public static void main(String[] args) {
System.out.print("请输入课程代号(1至3之间的数字):");
Scanner in = new Scanner(System.in);
try {
int courseCode = in.nextInt();
switch (courseCode) {
case 1:
System.out.println("C#编程");
break;
case 2:
System.out.println("Java编程");
break;
case 3:
System.out.println("SQL基础");
}
} catch (Exception ex) {
System.out.println("输入不为数字!");
}
System.out.println("欢迎提出建议!");
}
}
2、第二种情况
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
public class AccpException {
public static void main(String[] args) {
System.out.print("请输入课程代号(1至3之间的数字):");
Scanner in = new Scanner(System.in);
try {
int courseCode = in.nextInt();
switch (courseCode) {
case 1:
System.out.println("C#编程");
break;
case 2:
System.out.println("Java编程");
break;
case 3:
System.out.println("SQL基础");
}
} catch (Exception ex) {
System.out.println("输入不为数字!");
ex.printStackTrace();
}
System.out.println("欢迎提出建议!");
}
}
printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程
public class AccpException {
public static void main(String[] args) {
System.out.print("请输入课程代号(1至3之间的数字):");
Scanner in = new Scanner(System.in);
try {
int courseCode = in.nextInt();
//此处代码省略
} catch (Exception ex) {
System.out.println("输入不为数字!");
ex.printStackTrace();
}
System.out.println("欢迎提出建议!");
}
}
3、第三种情况
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
public class AccpException2 {
public static void main(String[] args) {
System.out.print("请输入课程代号(1至3之间的数字):");
Scanner in = new Scanner(System.in);
try {
int courseCode = in.nextInt();
switch (courseCode) {
case 1:
System.out.println("C#编程");
break;
case 2:
System.out.println("Java编程");
break;
case 3:
System.out.println("SQL基础");
}
} catch (NullPointerException ex) {
System.out.println("输入不为数字!");
}
System.out.println("欢迎提出建议!");
}
}
try/catch/finally
在try/catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行
public class AccpException3 {
public static void main(String[] args) {
System.out.print("请输入课程代号(1至3之间的数字):");
Scanner in = new Scanner(System.in);
try {
int courseCode = in.nextInt();
switch (courseCode) {
case 1:
System.out.println("C#编程");
break;
case 2:
System.out.println("Java编程");
break;
case 3:
System.out.println("SQL基础");
}
} catch (Exception ex) {
System.out.println("输入不为数字!");
} finally {
System.out.println("欢迎提出建议!");
}
}
}
多重catch块
1、一段代码可能会引发多种类型的异常
2、当引发异常时,会按顺序来查看每个 catch 语句,并执行第一个与异常类型匹配的catch语句
3、执行其中的一条 catch 语句之后,其后的 catch 语句将被忽略
public void method(){
try {
// 代码段
// 产生异常(异常类型2)
} catch (异常类型1 ex) {
// 对异常进行处理的代码段
} catch (异常类型2 ex) {
// 对异常进行处理的代码段
} catch (异常类型3 ex) {
// 对异常进行处理的代码段
}
// 代码段
}
抛出异常
如果在当前环境无法解决一个异常,就要将其抛出,把异常交给调用者处理
public class AccpTeacher {
private String id; // 教员编号,长度应为7
public void setId(String pId){
// 判断教员编号的长度是否为7
if (pId.length() == 7) {
id = pId;
} else {
throw new IllegalArgumentException("参数长度应为7!");
}
}
}
public class TeacherTest {
public static void main(String[] args) {
Teacher teacher = new Teacher();
try {
teacher.setId("088");
} catch (IllegalArgumentException ex) {
System.out.println(ex.getMessage());
}
}
}
声明异常
public class AccpTeacher {
private String id;// 教员编号,长度应为7
public void setId(String pId) throws IllegalArgumentException{
// 判断教员编号的长度是否为7
if (pId.length() == 7) {
id = pId;
} else {
throw new IllegalArgumentException("参数长度应为7!");
}
}
}
public class AccpTeacherTest {
public static void main(String[] args) {
AccpTeacher teacher = new AccpTeacher();
try {
teacher.setId("088");
} catch (IllegalArgumentException ex) {
System.out.println(ex.getMessage());
}
}
}