JavaSE中级之Java异常
Java异常
Exception:在程序的运行过程中,发生了不正常的现象,阻止了程序的运行,这就叫发生异常
用if - else 处理异常
缺点
- 代码臃肿,业务代码和处理异常代码混淆在一起
- 可读性差
- 需要花费大量时间和精力维护漏洞
- 很难堵住所有漏洞
try - catch 捕获异常
- 出现了异常先看异常代码的第一行,然后再看异常代码的最后一行
- 异常代码第一行一般是提示异常的类型,异常代码的最后一行一般是提示出现异常的位置
捕获异常
-
把可能出现异常的代码放到try - catch里面
try { Scanner sc = new Scanner(System.in); System.out.println("输入:"); int num = sc.nextInt(); System.out.println(num); }catch (Exception exception){ System.out.println("出错!"); }
原理
- 把可能出现异常的代码放到try - catch代码块里面,然后把异常封装成对象,被catch (Exception exception)中的Exception异常对象接收;然后执行catch{}里面的代码,try - catch后面的代码照常执行
- 如果没有异常catch中的代码就不会执行
- 如果发生异常,catch异常类型和报错的异常类匹配就执行catch里面的代码;如果不匹配就捕获异常失败,继续报错
- try中出现异常被catch捕获成功后,try中后续的代码不会执行
catch处理异常的方式
-
catch里面啥都不写
catch (Exception exception){ } -
catch里面提示异常,自定义异常信息
catch (Exception exception){ System.out.println("出错!"); } -
catch里面打印异常信息
catch (Exception exception){ System.out.println(exception.toString()); } -
显示异常描述信息
catch (Exception exception){ System.out.println(exception.getMessage()); } -
显示异常详细信息
catch (Exception exception){ exception.printStackTrace(); } -
抛出异常,后面的代码不执行
catch (Exception exception){ throw exception; }
finally修饰异常
- 将必须执行的代码放入finally中,这个代码就必定会执行
- 先执行finally,最后再执行return
- 关闭数据库资源,关闭IO流资源,关闭socket资源的代码都需要放到finally中
- System.exit(0)直接终止虚拟机,finally中的代码永远都不会执行
异常——多重catch
- try中出现异常之后,将异常类型和catch后面的类型一次比较,按照代码的顺序进行比较时,执行第一个和异常类型相匹配的catch语句
- 一旦执行其中一条catch语句之后,后面的catch语句就会被忽略
- 在写catch语句的顺序的时候,一般会将特殊异常放在前面,普通异常放在后面
- 先写子类异常再写父类异常
- JDK1.7之后异常的新的处理方式
- 可以用 | 符号进行连接
异常的分类与层次结构
运行时异常
-
不用特意对异常进行处理,程序运行后,系统会自动检测然后抛出异常
-
NullPointerException :空指针异常
int Arr[] = null; System.out.println(Arr.length); -
ArrayIndexOutOfBoundsException : 下标越界异常
int Arr1[] = {1,2,3,4,5}; System.out.println(Arr1[7]);
检测时异常
-
未雨绸缪,防患于未然
-
在编辑代码的时候就需要对代码进行异常处理
-
try - catch 解决异常示例
- ClassNotFoundException
//异常代码 Class.forName("java5.Cat"); //处理后的代码 try { Class.forName("java5.Cat"); } catch (ClassNotFoundException e) { e.printStackTrace(); } //处理后的代码2 public static void main(String[] args) throws ClassNotFoundException { Class.forName("java5.Cat"); }-
InstantiationException、IllegalAccessException
//异常代码 try { Class.forName("java5.Cat").newInstance(); } catch (ClassNotFoundException e) { e.printStackTrace(); } //处理后的代码1 try { try { Class.forName("java5.Cat").newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } catch (ClassNotFoundException e) { e.printStackTrace(); } //处理后的代码2 try { Class.forName("java5.Cat").newInstance(); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { e.printStackTrace(); } //处理后的代码3 public static void main(String[] args) throws InstantiationException, IllegalAccessException { Class.forName("java5.Cat").newInstance(); }
throw和throws的区别
位置不同
- throw写在方法的内部
- throws写在方法的声明处
内容不同
- throw后面接的是异常对象(检查异常,运行时异常)
- throws后接的是异常的类型,可以多个类型用逗号拼接
作用不同
- throw相当于异常出现的源头,制造异常
- throws是在方法的声明处,告诉方法的调用者,这个方法中可能会出现自己声明的异常,然后调用者对这个异常进行处理
- 自己处理或者继续向上抛出异常
自定义异常
- 如果继承的是运行时的异常,在使用的时候无需额外处理
- 如果继承的是检查异常,在使用的时候需要try - catch 捕获异常或者throws向上抛出异常
本文来自博客园,作者:{oy},转载请注明原文链接:https://www.cnblogs.com/Oysen/p/17005589.html

浙公网安备 33010602011771号