java基础(七):异常

异常

1.面对程序中的异常应该怎么办?

方式一:由开发者通过if-else来解决异常问题

  • 代码臃肿:业务代码和异常处理代码放一起

  • 程序员要花很大精力"堵漏洞“

  • 程序员很难堵住所有“漏洞”,对程序员本身要求较高

方式2:开发者不需要通过if-else来解决异常问题,而是Java提供异常处理机制。

它将异常处理代码和和业务代码分离,使程序更优雅,更好的容错性,高键壮性。

2.异常( Exception 也称例外)

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

  • 所需文件找不到
  • 网络连接不通或中断
  • 算术运算错 (被零除…)
  • 数组下标越界
  • 装载一个不存在的类或者对null对象操作
  • 类型转换异常

当Java程序出现以上的异常时,就会在所处的方法中产生一个异常对象。这个异常对象包括异常的类型,异常出现时程序的运行状态以及对该异常的详细描述

3.Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws

 

 

 try - catch 中catch如何处理异常:

  • 输出用户自定义异常信息
    • System.err.println("除数不能为零。");
    • System.err.println("被除数和除数必须是整数。");
  • 调用异常对象的方法输出异常信息

    • toString ( )方法,显示异常的类名和产生异常的原因

    • void printStackTrace() 输出异常的堆栈信息

    • String getMessage()返回异常信息描述字符串,是printStackTrace()输出信息的一部分

  • 继续向上抛出异常

    • throw e

异常类型:

  • Exception:异常层次结构的根类

  • ArithmeticException:算术错误情形,如以零作除数

  • ArrayIndexOutOfBoundsException:数组下标越界

  • NullPointerException:尝试访问 null 对象成员

  • ClassNotFoundException:不能加载所需的类

  • InputMismatchException:欲得到数据类型与实际输入类型不匹配

  • IllegalArgumentException:方法接收到非法参数

  • ClassCastException:对象强制类型转换出错

  • NumberFormatException:数字格式转换异常,如把"ab"转换成数字

try-catch-finally

在try-catch块后加入finally块,可以确保无论是否发生异常,finally块中的代码总能被执行

  • 无异常 try-finally
  • 有异常 try-catch-finally

通常在finally中关闭程序块已打开的资源,比如:文件流、释放数据库连接等。

finally块中语句不执行的唯一情况:

  • 异常处理代码中执行System.exit(1)退出Java虚拟机

finally块的具体执行过程:

  • 执行try或catch中代码
  • 遇到return/throw,先执行finally中语句块
  • 执行return/throw

4.异常分类

Error

Error类层次描述了Java运行时系统内部错误和资源耗尽错误,一般指与JVM或动态加载等相关的问题,如虚拟机错误,动态链接失败,系统崩溃等。

这类错误是我们无法控制的,同时也是非常罕见的错误。所以在编程中,不去处理这类错误。

打开JDK包:java.lang.Error,查看他的所有子类

注:我们不需要管理Error!

Exception

所有异常类的父类,其子类对应了各种各样可能出现的异常事件。

Exception分类

1.运行时异常Runtime Exception(unchecked Exception)

  • 可不必对其处理,系统自动检测处理
  • 一类特殊的异常,如被 0 除、数组下标超范围等,其产生比较频繁,处理麻烦,如果显式的声明或捕获将会对程序可读性和运行效率影响很大

2.检查异常 Checked  Exception

  • 必须捕获进行处理,否则会出现编译错误

声明异常throws

当Checked Exception产生时,不一定立刻处理它,可以再把异常Throws出去。

如果一个方法抛出多个已检查异常,就必须在方法的首部列出所有的异常,之间以逗号隔开。

子类声明的异常范围不能超过父类声明范围

手动抛出异常throw

Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出也可根据需要手工创建并抛出。

在捕获一个异常前,必须有一段代码先生成异常对象并把它抛出。这个过程我们可以手工做,也可以由JRE来实现,但是他们调用的都是throw子句。

注意抛出运行时异常和Checked异常的区别 :

抛出Checked异常,该throw语句要么处于try块中,要么方法签名中是由throws抛出 抛出运行时异常,没有以上要求

自定义异常

在程序中,可能会遇到任何标准异常类都没有充分的描述清楚的问题,这种情况下可以创建自己的异常类

从Exception类或者它的子类派生一个子类即可

习惯上,定义的类应该包含2个构造器:一个是默认构造器,另一个是带有详细信息的构造器

5.异常链

使用场合举例

在分层结构中,将底层原始异常直接传递给用户是不太好的

  • 对于普通用户,底层异常专业性强,不友好,对他们没有什么帮助
  • 对于恶意用户,可以利用抛出的异常信息作为破坏的线索

解决方案:异常转译

  • 使用catch块捕获异常,并throw一个新的更友好的业务异常
  • 可以保证底层的异常信息不扩散到用户界面,避免暴露更多的实现细节

异常转译也称为异常链

 

posted @ 2020-06-09 20:57  Vincent-yuan  阅读(209)  评论(0编辑  收藏  举报