代码之家  ›  专栏  ›  技术社区  ›  WhyNotHugo

Java中异常与可丢弃相关的开销

  •  27
  • WhyNotHugo  · 技术社区  · 16 年前

    throw new Exception();
    

    有相当大的开销,因为它会创建一个完整的堆栈跟踪等等。

    throw new Throwable();
    

    编辑
    分析师

    public Session newSession() {  
      validate_user_and_password();   
    }
    

    抛出UserNotValidException从
    返回 null 0

    编程视角异常和分析师视角异常之间有很大的区别。

    注意:我已经给出了一个非常简单和愚蠢的例子,这不完全是我的情况。
    无效的 这将是一件普通的事情,但我需要有适当的抽象和面向对象的代码,而且,就我个人而言,我认为这没有什么坏处。

    8 回复  |  直到 10 年前
        1
  •  49
  •   Asaph    16 年前

    Throwable 在创建stacktrace时也会创建它。从 java docs for Throwable :

    throwable包含创建线程时线程执行堆栈的快照。

    因此,就创建stacktrace的开销而言,两者之间应该没有区别 Exception 可抛出

    如果您正在为“异常事件”使用异常(您应该这样做),那么您不应该太担心stacktrace的开销。在运行的代码中很少发生异常事件。所以异常不应该以任何显著的方式影响正常代码的性能。

        2
  •  37
  •   dimo414    9 年前

    不,您需要自己的子类来避免这种影响。

    Exception ex = new Exception() {
        @Override public Throwable fillInStackTrace() {
            return this; // and do nothing else
        }
    };
    

    这将创建一个不会填充堆栈跟踪的异常实例(异常的创建委托给 fillInStackTrace 实际填充堆栈跟踪),因此创建成本较低。

        3
  •  3
  •   danben    16 年前

    在JIT编译中,抛出一个 Exception 在Java中。但是扔一个 Throwable 没有太大的不同,因为您也将在那里获得堆栈跟踪。

    如果您感兴趣,有一篇非常有趣的文章,叫做“实时编译中的高效Java异常处理”( link

        4
  •  1
  •   gpampara    16 年前

    你不应该扔或抓 Throwable.

    如前所述,例外应仅在需要时使用,即:在例外情况下,并且应针对产生例外的情况。把它放在一边,抓住一个 Throwable OutOfMemoryException . 这种程度的错误无法(轻松地)恢复,开发人员不应处理。

        5
  •  1
  •   Muhammad Bilal    12 年前

    Throwable 是异常的父类。所以 Exception class .

        6
  •  1
  •   nullptr    11 年前
        7
  •  1
  •   dimo414    9 年前

    Exception 除了公开与 Throwable . 所有的肉,也就是头顶上的肉,都生活在空中 可抛出 .

    即使 例外情况 确实引入了一些额外的开销,这显然是一种过度优化 可抛出

        8
  •  0
  •   Turing    16 年前

    java.lang.Exception 延伸 java.lang.Throwable ,所以它的开销是相同的。从 Javadoc :

    Throwable类是Java语言中所有错误和异常的超类。Java虚拟机只能抛出作为此类(或其子类之一)实例的对象,或者可以通过Java throw语句抛出这些对象。类似地,只有这个类或它的一个子类可以是catch子句中的参数类型。

    两个子类Error和Exception的实例通常用于表示发生了异常情况。通常,这些实例是在异常情况的上下文中新创建的,以便包含相关信息(例如堆栈跟踪数据)。