异常处理
异常:在程序中导致程序中断的指令流
1. 认识异常
package com.gkd.exception; public class ExceptionDemo1 { public static void main(String[] args) { int i = 10; int j = 0; System.out.println("---------------计算开始-----------------"); int result = i / j; System.out.println("---------------计算结束-----------------"); System.out.println(result); } }
Java异常体系结构图:
throwable:是所有异常的父类(根类)
throwable分两类:
-
Error:错误,JVM内部产生的错误,程序代码无法控制处理.
-
Exception:异常,一般由代码中的逻辑错误,语法错误所导致的程序中断.程序员应该尽量避免和处理异常.
Exception:
-
受检异常:编译期异常,Exception的直接或间接子类
-
非受检异常:运行时异常,RuntimeException的直接或间接子类
2 处理异常
异常处理的标准格式:
try{ // 有可能发生异常的代码段 }catch(异常类型 对象){ // 异常的处理操作 }catch(异常类型 对象){ // 异常的处理操作 } ... finally{ // 异常的统一出口 }
处理上面代码产生的异常
private static void arithmeticException() { int i = 10; int j = 0; System.out.println("---------------计算开始-----------------"); //快捷键:Alt+shirt+z int result = 0; try { result = i / j; } catch (ArithmeticException e) { System.out.println("除数不能为0"); e.printStackTrace(); } System.out.println("---------------计算结束-----------------"); System.out.println(result); }
如果一段代码有多个异常产生呢?接下来看下面的实例代码:
private static void gerResult() { Scanner input = new Scanner(System.in); System.out.println("请输入第一个数:"); int i = input.nextInt(); System.out.println("请输入第二个数:"); int j = input.nextInt(); int result = i / j ; System.out.println("result = " + result);
上面的代码要求用户输入两个数,如果输入的第二个数为0还会抛出ArithmeticException,如果输入的不是数字,则会抛出 InputMismatchException ,这个时候我们就要同时处理多个异常.
private static void gerResult() { try { Scanner input = new Scanner(System.in); System.out.println("请输入第一个数:"); int i = input.nextInt(); System.out.println("请输入第二个数:"); int j = input.nextInt(); int result = i / j ; System.out.println("result = " + result); } catch (ArithmeticException e) { System.out.println("有算数异常产生"); //e.printStackTrace(); } catch (InputMismatchException e) { System.out.println("请输入数字"); } }
3. 异常的统一出口
finally语句块:不管是否有异常产生,都会执行的代码段.
根据finally语句块的特点,我们可以在finally语句块中做一些资源回收,释放的操作.
private static void gerResult() { try { Scanner input = new Scanner(System.in); System.out.println("请输入第一个数:"); int i = input.nextInt(); System.out.println("请输入第二个数:"); int j = input.nextInt(); int result = i / j ; System.out.println("result = " + result); } catch (ArithmeticException e) { System.out.println("有算数异常产生"); //e.printStackTrace(); } catch (InputMismatchException e) { System.out.println("请输入数字"); } finally{ System.out.println("异常的统一出口"); } }
4. throws 关键字
throws用在方法声明的时候向上抛出异常,表示方法内部不处理异常,交给调用方去处理.
5. 自定义异常
package com.gkd.exception; public class MyException extends Exception { public MyException(String errorMessage){ super(errorMessage); } // @Override // public String toString() { // return "你是小猩猩吗"; // } }
使用我们的自定义异常
package com.gkd.exception; public class UseMyException { public boolean login(String name,String password) throws MyException { if("admin".equals(name) && "123456".equals(password)){ return true; } throw new MyException("用户名或密码错误!"); } }
测试代码:
package com.gkd.exception; import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入用户账号:"); String userName = input.next(); System.out.println("请输入登陆密码:"); String password = input.next(); UseMyException ume = new UseMyException(); try { if(ume.login(userName, password)){ System.out.println("登陆成功!"); } } catch (MyException e) { e.printStackTrace(); } } }
执行结果:
包的命名:范围,从大到小.
公司名.项目名.模块名称.exception