使用异常处理程序错误

目标:掌握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());
}
    }
}