将异常保留在 Java 中以有效使用垃圾收集器是否更好?

Is it better to keep exceptions in Java for effectively use a garbage collector?

我想少引入一个垃圾收集器。使用此代码是否更好:

private MyException myException = new MyException();

public void frequentlyUsedMethod(){
  try{
    ...
  }catch(Exception e){
    throw myException;
  }
}

而不是这个:

public void frequentlyUsedMethod(){
  try{
    ...
  }catch(Exception e){
    throw new MyException();
  }
}

如果我在第一种情况下理解正确,我们只创建一次 MyException,但在第二种情况下,我们将阻塞我们的堆并多次引发垃圾收集器。

没有!使用通常的、惯用的方式,每次都抛出一个新的异常。您建议的方法存在几个问题:

  1. 它会丢弃任何合理的堆栈跟踪,这是当异常从您的程序中抛出(或记录)时看到的最重要的事情。堆栈跟踪是在异常创建时填充的,而不是在它被抛出时填充的,所以你所有的堆栈跟踪都是相同的,没有信息,而且你不知道是哪个方法抛出它们的:

    Exception in thread "main" your.package.MyException
    at your.YourClass.<clinit>(YourClass.java:6)
    
  2. 由于 "performance" 原因,代码变得更加难以阅读。这总是通往地狱的必经之路,除非你能证明你的改变会产生重大影响,否则不要那样做。异常对象很可能不会存在很长时间 - 在这种情况下,为 GC 清理它非常便宜。

顺便说一下,如果您的方法经常抛出异常以至于它会有所作为,那么您很可能做错了什么。