如何在java中以相同的方法发送异常并返回值

How to send exception and return a value in the same method in java

提问人:andreiiz 提问时间:10/25/2023 最后编辑:andreiiz 更新时间:10/26/2023 访问量:60

问:

我知道不可能抛出异常并以相同的方法返回一个值,但我需要以某种方式执行此操作。我想使用 finally 块抛出异常并在返回值后。 像这样:

public Type myMethod() {
try{
//some elaborations
return result;
} catch(MyException myException) {
    //do something 
    return result;
} finally {
if(myException != null) {
 throw myException ;
}
}

有没有可能这样的事情,或者我怎样才能做到这一点?

编辑:或者我可以用不同的方法拆分吗?

Java 异常 终于

评论

0赞 Rob Spoor 10/25/2023
从块引发的异常会丢弃任何先前的 OR 语句。同样,a from 块会丢弃任何先前的 or 语句。如果你想要异常和值,那么你可以创建一个自定义异常,其中包含值的 getter,并抛出它。有关示例,请参阅 vsfDawg 的答案。finallyreturnthrowreturnfinallyreturnthrow

答:

0赞 StackFlowed 10/25/2023 #1

简短的回答是肯定的。创建一个具有 2 种数据类型异常和返回值的类。

public class ReturnExceptionResult {
    Object result;
    Exception ex;

...
}

public ReturnExceptionResult myMethod() {
    Object result;
    Exception ex;
    try{
        //some elaborations
        result=returnvalue;
    } catch(MyException myException) {
        //do something 
        ex=myException;
        result=returnvalue;
    }
        return new ReturnExceptionResult(result,ex);
}

评论

0赞 andreiiz 10/25/2023
这样,在返回 ReturnExceptionResult 后,我必须决定是抛出异常还是使用结果,所以这同样是无用的
1赞 Arfur Narf 10/26/2023
从本质上讲,您似乎在问如何同时正常返回和不正常返回。看到问题了吗?可以正常返回,将异常对象作为返回值的一部分,也可以引发异常,将返回值作为异常对象的一部分。
2赞 vsfDawg 10/25/2023 #2

请考虑创建一个自定义异常,其中包含原始 Exception 作为原因和当前值。

一个幼稚的例子:

public class ValueException<T> extends Exception {
  private T value;
  public ValueException(T value, Exception cause) {
    super(cause);
    this.value = value;
  }
  ... stuff ...
}

在您的方法中...

public Type myMethod() throws ValueException {
  Type result = null;
  try {
    //some elaborations
    return result;
  } catch(Exception e) {
    throw new ValueException(result, e);
  }
}

一些来电者...

public Type getType() {
  try {
    return myMethod();
  } catch (ValueException e) {
    if (isGoodEnough(e.getValue()) {
      return e.getValue();
    }
    throw new RuntimeException("Failed to get Type", e);
  }

评论

0赞 Rob Spoor 10/25/2023
可以使用 检索原始错误。如果您知道它的类型,则可以重新抛出它(使用强制转换,作为返回)。例如e.getCause()getCause()Throwablethrow (RuntimeException) e.getCause();
0赞 Reilas 10/26/2023 #3

"...我知道不可能抛出异常并以相同的方法返回一个值,但我需要以某种方式执行此操作。...

。有没有可能这样的事情......我可以用不同的方法拆分吗?

最简单的方法是使用

class Result<T> {
    T value;
    Throwable e;
}

下面是一个 r 将始终包含“abc”的示例。

Result x() {
    Result<String> r = new Result<>();
    try {
        Integer.parseInt(r.value = "abc");
    } catch (Exception e) {
        r.e = e;
    }
    return r;
}

您需要检查 e 是否为 null

Result<String> r = x();
if (r.e != null) System.out.println(r.e);
System.out.println("r.value = " + r.value);