当前位置: 首页 > 知识库问答 >
问题:

在Java中始终抛出相同的异常实例

石正卿
2023-03-14

我只是想杀一儆百。通用代码:

if (!checkSomething(myObject))
   throw new CustomException("your object is invalid");

备选案文:

static CustomException MYEXP = new CustomException("your object is invalid");

//somewhere else
if (!checkSomething(myObject))
    throw MYEXP;

当然,我在这里做了一些假设:

    null
    null

免责声明:我的代码都不像建议的那样工作,我也不打算像这样管理异常,我只是在做一个“假设”的问题,这种好奇心是从视频的传入中产生的。我想:如果是在Scala中完成的,为什么不是在Java中?

共有1个答案

澹台岳
2023-03-14

不,别那么做。昂贵的部分不是处理异常,而是生成StackTrace。不幸的是,stacktrace也是有用的部分。如果抛出一个已保存的异常,您将传递一个误导性的StackTrace。

在Scala的实现中,可能存在这样做是有意义的情况。(也许他们正在做一些递归的事情,想要预先生成一个异常对象,这样在内存耗尽的情况下,他们仍然可以生成一个异常。)他们也有很多关于他们在做什么的信息,所以他们有更好的机会做对。但是JVM语言实现者所做的优化是一个非常特殊的情况。

所以你不会破坏任何东西,除非你认为提供误导性信息构成破坏。对我来说,这似乎是一个很大的风险。

groovy:000> class MyException extends Exception {
groovy:001>     public Throwable fillInStackTrace() {}}
===> true
groovy:000> e = new MyException()
===> MyException
groovy:000> Arrays.asList(e.stackTrace)
===> []
 类似资料:
  • 我有以下2个代码片段,我想知道是什么使java编译器(在Eclipse与Java7)显示错误的第二个片段,为什么不是第一个。 以下是代码片段: 片段1 片段2 在eclipse中,snippet1显示为finally块添加'SuppressWarning',但在snippet2中,它显示为catch块中的throw语句添加'throws或try catch'块。 我详细研究了以下问题,但没有提供任

  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 问题内容: 除了抛出,这意味着我方法的所有调用者都需要捕获Exception(可以包含RuntimeExceptions),我想在出现问题时抛出一种更特定类型的异常。 我可以创建自己的扩展了Exception或其他异常类型的异常类型,但是我很好奇是否可以重用Java语言所附带的一些异常,例如: IllegalArgumentException UnsupportedOperationExcepti

  • 问题内容: 我目前正在使用play2框架。 我有几个正在抛出的类,但是play2s全局处理程序使用throwable而不是异常。 例如我的一门课是抛出一个。我是否可以检查可抛物体(如果是)? 问题答案: 您可以使用它来检查它是否存在。 例: 假设是参考。

  • 问题内容: 我有一个关于Java中重新引发异常的非常简单的问题。 这是代码片段: 为什么我们需要在第一个版本中重新抛出,而第二个版本看起来更优雅?可能有什么好处,并且优先选择哪个版本? 问题答案: 你是对的。第二版更好。而且,第一个版本没有任何意义。除了异常的堆栈跟踪为“错误”之外,它的功能相同。 有“重新抛出”异常的原因如下: 如果您之前有事要做。 如果捕获一种类型的异常并抛出另一种类型的异常:

  • 这是可能的在Java抛出任何异常,即使它是刚刚宣布抛出的时刻,下面的例子: 请分享你对这种方法的好坏的看法。 同样的问题是扩展RuntimeException(这不是抽象的)并立即扔掉它。