异常

作者: 后来丶_a24d | 来源:发表于2019-10-26 21:01 被阅读0次

目录

目录.png

异常概览

异常.png

细节说明

  • 错误Error保留给 JVM 使用,以指示:资源不足、不可恢复故障或其他导致无法继续执行的条件。
  • runtime异常以及其子类表示未受检异常,表示可恢复,项目用的最多就是这个。exception以及除了runtime子类都是受检异常,比如文件未找到抛出受检异常就知道要换个文件了。未受检异常可以不抛出,方法上也可以不加throws,编译器会处理。
  • 消除 checked 异常的最简单方法是返回所需结果类型的 Optional 对象。
  • 构造器抛异常 如果构造器用来new文件,这时候应该由调用方去用try with resource处理而不是构造器finally清楚,因为finally最终一定会被执行, 文件被关闭这个类中文件生命周期就结束了。
  • finally用来清理资源,比如流关闭之类的
一个失败的方法调用应该使对象处于调用之前的状态
  • 设计不可变对象
  • 而对于操作可变对象的方法,实现故障原子性的最常见方法是在执行操作之前检查参数的有效性。
  • 以对象的临时副本执行操作,并在操作完成后用临时副本替换对象的内容。(例如,一些排序函数在排序之前将其输入 list 复制到数组中,以降低访问排序内循环中的元素的成本。这样做是为了提高性能,但是作为一个额外的好处,它确保如果排序失败,输入 list 将保持不变)

try with resource

  • 根据实现了AutoClose接口的clsoe方法,会自动调用close方法资源规范头里面的资源会被关闭,因为InputStream实现了AutoCloseable, 会保护第一个资源,按照顺序保护接下来的
public static void main(String[] args) throws IOException {
        //资源规范头里面的资源会被关闭,因为InputStream实现了AutoCloseable
        try(
                InputStream in = new FileInputStream(new File("TryWithResources.java"))
        ) {
            int contents = in.read();
            // 这里是抛出IOE exception, 异常子类匹配也可以,也可以加|处理
        } catch(Exception e) {
            System.out.println("test");
        }

    }

异常限制

  • 当覆盖方法的时候,只能抛出在基类方法的异常说明里列出的那些异常。这个限制很有用,因为这意味着与基类一起工作的代码,也能和导出类一起正常工作,异常也不例外(否则的话,在使用基类的时候就不能判断是否捕获了正确的异常)。
  • 尽管在继承过程中,编译器会对异常说明做强制要求,但异常说明本身并不属于方法类型的一部分,方法类型是由方法的名字与参数的类型组成的。因此,不能基于异常说明来重载方法
    在继承和覆盖的过程中,某个特定方法的“异常说明的接口”不是变大了而是变小了。
  • 例子
class BaseballException extends Exception {}
class Foul extends BaseballException {}
class Strike extends BaseballException {}
class StormException extends Exception {}
class RainedOut extends StormException {}
class PopFoul extends Foul {}

abstract class Inning {
    Inning() throws BaseballException {}
    public void event() throws BaseballException {
    }
    public abstract void atBat() throws Strike, Foul;
    public void walk() {}
}
interface Storm {
    void event() throws RainedOut;
    void rainHard() throws RainedOut;
}
public class StormyInning extends Inning implements Storm{
    // 子类构造器可以新增异常
    public StormyInning() throws RainedOut, BaseballException {}
    // 编译不通过,继承的时候异常只能基类的更小集合
    // void walk() throws PopFoul {}
    // 接口不能向基类中的现有方法添加异常:
    // public void event() throws RainedOut {}
    @Override
    public void rainHard() throws RainedOut {}
    // 可以不抛异常继承
    @Override
    public void event() {}
    // 可以选择抛出子异常
    @Override
    public void atBat() throws PopFoul {
        throw new PopFoul();
    }
    public static void main(String[] args) {
        try {
            StormyInning si = new StormyInning();
            si.atBat();
        } catch(PopFoul e) {
            // 子类就根据子类来
            System.out.println("Pop foul");
        }  catch(RainedOut e) {
            System.out.println("Rained out");
        } catch(BaseballException e) {
            System.out.println("Generic baseball exception");
        }
        try {
            Inning i = new StormyInning();
            i.atBat();
        } catch(Strike e) {
            System.out.println("Strike");
        } catch(Foul e) {
            // 基类的异常则根据基类来,并结合子类,子类没抛Strike异常,则不会走第一个异常
            System.out.println("Foul");
        } catch(RainedOut e) {
            System.out.println("Rained out");
        } catch(BaseballException e) {
            System.out.println("Generic baseball exception");
        }
    }
}


参考文章

相关文章

  • 异常和模块

    异常 目标 了解异常 捕获异常 异常的else 异常finally 异常的传递 自定义异常 一. 了解异常 当检测...

  • python多线程

    异常基础知识 -异常简介: 运行时错误 -异常类: 异常数据 异常名称,异常数据,异常类型 -自定义异常 clas...

  • dart 异常

    dart中的异常 异常处理 抛出异常 异常捕获

  • Java基础之异常

    Java基础之异常 目录 异常简单介绍 ThrowableErrorException 异常分类 如何处理异常异常...

  • python核心编程-错误与异常

    本章主题:什么是异常Python中的异常探测和处理异常上下文管理引发异常断言标准异常创建异常相关模块 什么是异常 ...

  • motan(RPC)系统梳理知识点

    异常分类: 业务异常(bizException) 服务异常(serviceException) 框架异常(fram...

  • 异常

    Java异常体系 异常的分类 Java的异常分为两大类:Checked异常和Runtime异常(运行时异常)。所有...

  • 从零构架个人博客网站(二)-全局异常处理

    中间件的异常 全局异常中间件全局异常监听定义异常的返回结果定义常见的异常状态开发环境 异常查看 对于异常,我们可以...

  • Node.js异常处理

    Node.js异常分类: 变量异常 函数异常 调用异常 变量异常 未定义变量 未包含对象 变量类型错误 函数异常 ...

  • python 异常

    异常 目标 异常的概念 捕获异常 异常的传递 抛出异常 01. 异常的概念 程序在运行时,如果 Python 解释...

网友评论

      本文标题:异常

      本文链接:https://www.haomeiwen.com/subject/kpmuvctx.html