异常

孤街醉人 提交于 2019-11-27 19:17:40

一、异常概述

异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序

1、传统处理异常的方式(if else): [1]业务逻辑和处理异常的判断逻辑耦合在一起。[2]代码冗余

2、Java使用异常处理机制为程序提供异常处理的能力。异常处理机制完成后,程序可以继续执行

3、异常的常见方法:printStackTrace() 输出异常的堆栈信息,第一行:表示异常类型和异常描述(可为空),最后一行:包含异常的类、方法、具体代码行号

           getMessage() 获取异常的描述

           toString() 返回异常的类型和异常描述

4、try-catch:try{} 代码块用于执行可能存在异常的代码,catch{}代码块用于捕获并处理异常。

  [1]正常执行,try→try-catch块后的代码段

  [2]异常发生,try{} 代码块内某行代码产生异常,jvm创建一个具体异常对象ex,try{} 内不再向下执行,找到catch(Exception e){}捕获并处理异常

    在异常捕获过程中需要进行异常类型匹配,若e=ex(多态)

  [3]匹配异常类型不匹配,程序直接中断

5、try-catch-finally:try{} 执行可能有异常的代码,catch{}捕获并处理异常,finally{}用于回收资源(关闭文件、关闭数据库、关闭管道)的代码。

  finally代码块不管是否出现异常,都必须执行。finally唯一不执行的情况:System.exit(0) jvm正常退出。

  try{}内存在return时,try→finally→return;    catch{}内存在return时,try→catch→finally→return

6、多重catch,书写原则:[1]异常子类先匹配。[2]异常父类后匹配,用于默认匹配。

二、异常分类

Throwable 类是 Java中所有错误或异常的父类。Throwable有两个子类Error和Exception。

1、Error(错误):仅靠程序本身无法恢复的严重错误。除了尽力使程序安全退出外,其他方面无能为力,例如:jvm崩溃、jvm内存耗尽、动态链接异常。

2、Exception:靠程序本身通过异常处理机制能处理的非正常情况。分为两类:

  ①运行时异常:运行时异常,不要求程序必须做出处理。RuntimeException是所有运行时异常的父类。

    即使没用try-catch或throws处理,仍可以编译和运行。若运行时发生异常,会输出异常的堆栈信息并中止程序执行。

  ②检测时异常:除运行时异常外的其他异常类都是检测时异常,程序必须处理,否则出现编译错误,无法通过编译。但Java不存在该类。

3、常见的运行时异常:

  InputMismatchException:控制台输入不匹配异常          ArithmeticException:算术计算异常。例如:除数为0

  ArrayIndexOutOfBoundsException:数组下标越界           NullPointerException:空指针异常

  IllegalArgumentException:方法接收到非法参数            ClassCastException:强制类型转换异常

  NumberFormatException:数组格式化异常。如把"abc"转成数字     NoSuchElementException:表明枚举中没有更多的元素

  ConcurrentModificationException:并发操作异常

4、常见的检查时异常

  ClassNotFoundException:无法找到类异常             SQLException:数据库操作异常。

  FileNotFoundException:文件未被发现               IOException:IO异常

  ParseException:解析异常                     TimeoutException:超时异常

  InterruptedException:中断异常。 

三、声明异常

 throws:定义方法时,事先知道方法在调用时会有异常,但不知该如何处理,此时可在该方法上声明异常。表示方法调用时会有异常,请调用者自行处理。

  一个方法可以声明多个异常,用,号分割。声明异常和方法重写有关系(“可犯小错”):

    [1]如果父类声明了异常(检查时或运行时),子类可以完全遵循父类异常,也可以不声明异常。

    [2]如果父类完全没有声明异常,子类可完全遵循父类异常,也可声明RuntimeException,但不能声明Exception。

    [3] 如果父类声明了运行时异常,子类可完全遵循父类异常,也可不声明异常。

四、throw

当系统异常满足不了开发需要时,开发者可以自行根据需要自行抛出异常。throw 用于手动抛出异常。

  e.g:public void a() throws Exception{if...else {throw new Exception("...");}}

可以自定义异常类。自定义异常类步骤:

  [1] 确定异常类型。继承Excepion 或者RuntimeException

  [2] 编写自定义异常类,并实现构造方法。

  [3] 在方法需要的地方手动声明并抛出异常。

五、throw和throws的区别

1、作用不同:throw用于程序员自行产生并抛出异常;throws用于声明在该方法内抛出了异常。

2、使用的位置不同:throw位于方法体内部,可作为单独语句使用;throws必须跟在方法参数列表之后,不能单独使用。

3、内容不同:throw抛出一个异常对象,且只能是一个;throws后面跟异常类,而且可以有多个。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!