Java自定义异常抛出在不同项目之间的行为不同

时间:2010-05-06 04:09:30

标签: java

我试图在我的代码中调用以下内容:

 public void checkParticleLightRestriction(Particle parent) throws LightException {
 if ( parent == null ) {
      throw new LightException("quantum-particle-restrict.23", this);
    }

在一个Project中抛出异常并且效果类似于调用“return”,从而返回到紧接调用此方法的位置。

然而,在另一个项目中,我从当前包中完成抛出,并且在此方法之前的点之前达到了一定程度。

它喜欢而不是被赶出酒吧而是被驱逐出境。

我的选择是在try / catch中包装throw但是我想知道为什么这两个项目之间的行为差​​异?

2009年5月9日 我一直在玩你的建议但我仍然没有解决这个问题。抛出自定义异常的调用似乎在这个特定的项目中似乎没有被调用,无论Exception类是扩展RuntimeException还是Exception。

public class LightException extends Exception {

    ...etc

    public LightException(String errorCode, Object object) {

        super(errorCode == null ? null : errorStrings.getString(errorCode));
        this.errorCode = errorCode;
        this.invalidObject = object;
    }

    public LightException(String errorCode, Object object, Exception exception) {
        this(errorCode, object);
        add(exception);
    }

    ...
}

任何想法都赞赏。

5 个答案:

答案 0 :(得分:2)

如果不查看调用此方法的代码,就无法确定发生了什么。

也许在一个项目中,异常被捕获而不是在另一个项目中?如果LightException是未经检查的异常,则可能会发生这种情况。

编辑:

你说(在你原来的问题中):

  

抛出异常并且......   立刻回到了原点   在这种方法的地方取得了成功   调用。

唯一可能发生这种情况的实例是调用checkParticleLightRestriction()的方法包含在try...catch块中,例如:

try {
  checkParticleLightRestriction(particle);
} catch (LightException e) {
  // do something with e
}

// this is the point 'immediately succeeding where this method was called'

答案 1 :(得分:0)

异常总是被第一个周围的try / catch块捕获,该块匹配正在抛出的异常的类型。如果try / catch块捕获与异常或其中一个父类型相同类型的异常,则它将匹配。

您的两个项目很可能在调用checkParticleLightRestriction方法的块中捕获的异常类型不同。

答案 2 :(得分:0)

  

我的选择是在try / catch中包装throw但是我想知道为什么这两个项目之间的行为差​​异?

行为没有区别。每当抛出异常时,它都会被捕获 “最近”catch能够捕获它(靠近堆栈轨迹中的距离定义)。如果你知道你想要捕捉到什么以及在哪里捕捉某些东西,那么就这样说吧。

throw不是简单的return声明。

另见

  • JLS 11.3 Handling of an Exception
      

    当抛出异常时,控制权从导致异常的代码转移到处理异常的catch语句的最近的动态封闭try子句。

答案 3 :(得分:0)

您的Exception代码看起来不错。

问题很可能出在调用代码中。两个项目中的调用代码似乎与catch LightException做了不同的事情。

  

在一个Project中抛出异常并且效果类似于调用“return”,从而返回到紧接调用此方法的位置。

这里,调用代码可能会吞噬catch块中的异常并继续前进。

  

然而,在另一个项目中,我从当前包中完成抛出,并且在此方法之前的点之前达到了一定程度。

在这种情况下,可能会捕获异常,可能包含在RuntimeException中,然后从catch块中重新抛出。这会将异常传播到堆栈中,然后由一般处理异常的代码处理。

如果不知道如何调用此方法,则无法添加更多内容。如果您可以访问这些不同项目的代码,则可以确认不同的处理技术。

答案 4 :(得分:0)

我为所有在这个问题上绞尽脑汁的人道歉。我有错。它涉及由于没有找到URL问题导致链上的资源丢失。

我会纠正这一点,希望所有人都能解决。