今天为大家带来的是技术篇中的错误和异常处理的相关知识介绍,希望对大家有所帮助哦
错误和异常处理
- 通用的异常和处理错误
- 错误
- 这里的错误就是程序里面的所有异常情况
- 错误的类型
- 用户的输入错误
- 设备错误,硬件错误
- 硬件限制:硬盘满了,可用内存已经没有了
- 代码错误:空指针,数组越界
- 错误处理
- 预先阻止
- 错误中进行恢复
- 优雅的退出
- 处理错误
- 告诉用户有错误
- 保存工作
- 返回到安全的状态并且保证用户处理其他的控制
- 允许用户保存工作并且优雅的退出程序
- 不好做 因为错误代码和错误条件可能有一定距离
- 稍微具体点的方法
- 返回中性值
- 接着执行并且返回一个无害的值
- 对于正确性要求高的不行
- 替换下一组有效的数据
- 返回和以前相同的答案
- 用最接近的值来替代(健壮性)
- 接着执行,跳过去,使用日志把警告信息记录下来(健壮性)
- 返回错误代码:失败了以后告诉用户错误代码(正确性)
- 缺点1:不够直观
- 缺点2:错误代码对照表需要设置的很完善
- 调用一个错误集中处理模块(正确性)
- 好处:利于调试
- 弹出窗口,直接显示错误信息(正确性)
- 好处:直观
- 缺点:存在大量的提示,管理比较困难
- 局部解决错误
- 好处:对于开发人员来说很灵活,在某个模块解决了
- 缺点:处理不好可能散播到全局
- 关机(正确性)
- 宁可关机也不能以错误的方式接着执行
- 返回中性值
Java里错误和异常处理
- Error
- 描述运行时Java内部运行时候的错误,Java自身出现错误或者内存耗尽之类的,我们做不了任何事情,除了比较友好的退出之外
- Exception
- 自己程序里的错误
- 异常处理
- 主要作用:程序控制权把出现错误的代码转移到处理错误代码的代码
- 出现异常之后会有一个可替代的路径而不是走正常路径
- 好处是什么:
- 不会忘记处理一个错误的模块
- 提高更加高层的错误信息和堆栈追踪:可视化的错误展示
- 提高代码的结构:把正常的代码和处理异常的代码进行分离
- 易于提高健壮性和正确性
- 异常分类(checked/unchecked)
- 运行时异常:
- 程序里变成错误导致的:认真写程序是不应该抛出来的(程序员懒hhh)
- 类型转换,空指针,数组越界
- it is your fault
- 除了运行时异常的异常:
- check 异常
- 这是编译器要检查的
- 无论哪个方法写出来的,是否有异常处理
- 运行时异常:
- checked异常处理
- 关键字:try catch finally throws throw
- 三个操作
- 定义异常(throws)
- 抛出异常(throw)
- 捕获异常(try catch finally)
- 声明异常
- 告诉编译器返回什么值也告诉编译器返回什么样的错误
- 两种方法:
- 抛出异常并解决
- 只抛出异常,不处理,总有处理模块,没有的的话,编译器不通过
- 抛出异常的四种情况
- 调用某个方法,方法本身会抛出异常
- 检测到一个错误,自己抛出一个异常
- Java虚拟机会捕获异常然后跑出来(a[-1] = 0)
- 在虚拟机和运行时库产生的内部错误
- 程序里面可以抛出unchecked 异常和Error ,但是前者自己能解决,后者抛出来也解决不了
- 抛出来一定要处理!
怎么抛出一个异常
- 抛出异常的两种方法
- 方法 后面跟着 throw ..Exception 的声明;方法内部抛出异常(throw new …Exception() )
- 在异常类时候定义一个字符串,字符串传给异常
- 怎么使用
- 找到合适的异常类
- 声明一个对象
- 抛出
- 不需要考虑返回值,遇到异常直接跳到捕获者那里进行处理 catch
- 定义创建异常类
- 定义的异常类 继承 Exception 就可以 绝大部分是为了记录是什么出错了,出错信息
怎么捕获和处理异常
- try catch机制
- Try 已经抛出异常 try之后代码被忽略到了
- catch如果匹配try 由catch处理
- 如果catch中没有匹配的 异常处理,被访问的程序退出
- 将处理异常 交给调用者, 自己只是在方法中声明
- 获得异常更加详细信息
- 得到异常的处理信息
- 得到异常对象的具体类型
- 重新抛出异常
- 在异常处理的catch里面声明一个新的类型的异常处理对象,用于改变异常的类型,对异常的信息进行重新封装
Finally clause
- 不管异常是否抛出 是否被捕获 Finally中语句都会执行
- 这里有四道例题 执行谁 不执行谁
- catch一旦进行了正确的处理,try catch之后的代码可以继续正确的执行
Try with resources statement
- try 调用一个资源 资源里面必须实现AutoCloseable接口,这样就不用写finally了
分析异常信息
- 方法调用的时候采用堆栈结构
- 虚拟机 在这层程序里找处理方法,没有找到,按照进栈顺序,一层一层的往上找
- 分析Stack Trace
- 使用一个StackTraceElement 数组,然后进行analyze 的分析(analyze 数组名字)
使用异常
- 异常处理不能代替简单的测试
- 少一点细化异常,都放在一起进行处理
- 利用好异常的层级结构
- 异常越详细越好,不要只抛出最上层的异常