0

当然这应该是有效的Java?我的语法有一点错误吗?

return (url != null) ? url : (throw new NotFoundException("No url"));

如果不是,我想我必须这样做:

if(url == null)
    throw new NotFoundException("No url");
return url;

有人有更简洁的吗?

4

4 回答 4

5

因为你没有履行回报:

return <comparison> ? <value1> :(else) <value2>

在您的情况下,您正在实现value1但不是value2,而是抛出一个新的异常。

您实际的第一个代码将被翻译成

if (url != null) {
    return url;
} else {
    return throw new NotFoundException("No url"); //makes sense?
}
于 2012-11-03T17:15:12.140 回答
4

三元运算符采用(从其名称中可以清楚地看出)三个参数。第一个是比较(其值被转换为布尔值)。后两个必须共享一个类型(或可转换为相同类型),即作为整个语句类型的类型。

您的代码中的问题是这throw new NotFoundException("No url");是一个语句。语句没有值,因此,不与其他任何东西共享类型。这就是为什么不允许在三元运算符的第二个或第三个参数中使用语句的原因。这无关紧要,因为作为语句的部分恰好是 throw 语句,但这是巧合。为了使三元运算符通常有意义,两个值需要具有相同的值,因此不能是语句。

ConditionalExpression(请注意,在 Java 中,所有对象都从 java.lang.Object 继承,如果 a 中的两个值之一(如语言定义中所称)是原语,则java 具有特殊(和复杂)的转换规则,所以如果这两个论点都不是陈述,它会起作用。)

于 2012-11-03T17:21:23.470 回答
2

它是无效的,因为它不符合 BNF:

Expression:
    Expression1 [ AssignmentOperator Expression1 ]

 Expression1:
    Expression2 [ Expression1Rest ]

Expression1Rest:
    ? Expression : Expression1
于 2012-11-03T17:25:35.173 回答
2

如果你真的非常喜欢简洁(我喜欢!),有办法解决这个问题声明一个方法

public static <T> T trhow(RuntimeException e) {
  throw e;
}

然后只写trhow(new MyException());而不是throw new MyException();. 我不确定这将如何在三元运算符中间推断您的类型,但也许您可以使用具体类型而不是泛型类型。

此外,如果您希望这适用于已检查的异常,那将更加麻烦。有一个习惯用法允许您在不声明的情况下抛出任何已检查的异常,但这会破坏首先检查它的意义。

于 2012-11-03T17:26:53.317 回答