1、什么是异常
异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
2、异常处理
2.1 try、catch结构
将可能产生异常的代码放入到try语句结构中
import java.util.Scanner; public class demo { public static void main(String[] args) { Scanner in = new Scanner(System.in); try { System.out.print("请输入被除数:"); int num1 = in.nextInt(); System.out.print("请输入除数:"); int num2 = in.nextInt(); System.out.println(num1 + "/" + num2 + "=" + num1 / num2); System.out.println("感谢使用本程序!"); } catch (ArithmeticException e) { //这里只能处理算数异常 System.out.println("除数不能为0"); } } }
注:
1)try结构中的代码不会产生异常,那么catch结构的代码就不会执行
2)try结构中的代码产生了异常,并且catch结构的代码能够处理这个异常,那么catch处理完异常后,程序继续往下执行
3)try结构中的代码产生了异常,但是catch结构的代码不能处理这个异常,程序就会被中断
4)引发多种类型的异常,可以在try结构后面写多个catch语句块。排列catch语句有先后顺序,顺序为:先子类后父类。发生异常时按顺序逐个匹配且只执行第一个与异常类型匹配的catch语句
public class demo { public static void main(String[] args) { try { Scanner in = new Scanner(System.in); System.out.print("请输入被除数:"); int num1 = in.nextInt(); System.out.print("请输入除数:"); int num2 = in.nextInt(); System.out.println(num1 + "/" + num2 + "=" + num1 / num2); }catch (ArithmeticException e) { System.out.println("除数不能为0"); }catch(InputMismatchException e){ System.out.println("被除数和除数只能是整数"); }catch(Exception e){ System.out.println("产生了一个异常"); }finally{ System.out.println("感谢使用本程序!"); } } }
2.2 try、catch、finally结构
当try结构中的代码产生的异常,catch结构不能处理,会中断程序的执行。如果想让程序忽略catch结构处理继续执行,需要使用finally语句块。
import java.util.Scanner; public class demo { public static void main(String[] args) { Scanner in = new Scanner(System.in); try { System.out.print("请输入被除数:"); int num1 = in.nextInt(); System.out.print("请输入除数:"); int num2 = in.nextInt(); System.out.println(num1 + "/" + num2 + "=" + num1 / num2); System.out.println("感谢使用本程序!"); return; } catch (ArithmeticException e) { //这里只能处理算数异常 System.out.println("除数不能为0"); System.exit(1); //程序终止 }finally { System.out.println("程序执行完毕"); } } }
注:
1) finally语句块中的代码唯一不执行的情况是在前面的try结构或者catch结构中存在退出系统的语句System.exit(int status)。 status参数用作状态代码,按照惯例,非零状态代码表示异常终止。
2) 若try结构中或者catch结构中存在return语句,finally结构里的语句仍会执行,执行完之后在return。
2.3 throw 和 throws的用法
throw:抛出异常
throws:声明异常
当我们调用一个声明了异常的方法(构造方法和普通方法),我们需要去解决这个方法声明的异常,有两种方法解决: 1)继续进行声明,谁调用谁继续声明,main方法声明的异常由Java虚拟机来处理。
public void setSex(char sex) throws Exception { throw new Exception("性别只能是男或女"); }
public class Test { public static void main(String[] args) throws Exception { Student stu = new Student(); stu.setSex('男'); } }
2)调用产生了异常的方法,可以进行try-catch处理
public class Test { public static void main(String[] args) { Student stu = new Student(); try { stu.setSex('男'); } catch (Exception e) { e.printStackTrace(); } } }