为什么这不是有效的Java?

为什么这不是有效的Java?,java,optimization,coding-style,code-snippets,Java,Optimization,Coding Style,Code Snippets,这应该是有效的Java吗?我的语法有点错吗 return (url != null) ? url : (throw new NotFoundException("No url")); 如果不是,我想我必须这样做: if(url == null) throw new NotFoundException("No url"); return url; 有人有更简洁的吗?因为你没有完成回报: return <comparison> ? <value1> :(else)

这应该是有效的Java吗?我的语法有点错吗

return (url != null) ? url : (throw new NotFoundException("No url"));
如果不是,我想我必须这样做:

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

有人有更简洁的吗?

因为你没有完成回报:

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

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

代码中的问题是抛出new NotFoundExceptionNo url;这是一份声明。语句没有值,因此不与任何其他语句共享类型。这就是为什么三元运算符的第二个或第三个参数中不允许使用语句的原因。这并不重要,因为语句的一部分恰好是抛出语句,但这是巧合。为了使三元运算符在一般情况下有意义,两个值需要具有相同的值,因此不能是语句


请注意,在Java中,所有对象都继承自Java.lang.Object,如果语言定义中调用的ConditionalExpression中的两个值中有一个是基元,则Java具有特殊而复杂的转换规则,因此如果这两个参数都不是语句,它将起作用。

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

Expression:
    Expression1 [ AssignmentOperator Expression1 ]

 Expression1:
    Expression2 [ Expression1Rest ]

Expression1Rest:
    ? Expression : Expression1
如果你真的,真的喜欢简洁的话,这是有办法的!。声明一个方法

public static <T> T trhow(RuntimeException e) {
  throw e;
}
然后写下新的MyException;而不是抛出新的MyException;。这将在三元运算符的中间推断出你的类型,我不确定,但是也许你可以用一个具体的而不是泛型类型来逃脱。


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

throw子句不符合表达式的定义。throw是一条语句,不能在表达式中使用。这就像试图说真的?hi:布尔变量;如果你想要更简洁的东西,只要在url==null时抛出newnotfoundexceptionno-url;返回url;在我看来,你的简洁思想不是好的编码风格,因为它降低了可读性exception@Blundell-构造不是if/else语句。对,对,这是我对三元的理解,它用于赋值,我不能将返回值赋值给throws子句。我把它看作是一本速记本。感谢有很多方法可以伪造,但不值得——简单的if更容易理解,也不容易出错。当我打字时,Luiggi编辑了他的答案,将基本相同的内容以代码形式包含进去,但我还是决定发帖子,因为我的解释方法有点不同。不,你放进去的一定是什么?expr:expr。throw不是一个表达式,所以即使有两个throw共享一个类型,也不能使用ternanary运算符。。。不是因为cos语句的计算结果不是任何类型或类型value@Esailija:一条没有类型的语句和另一条没有类型的语句不共享任何类型。就像两个空集合的横截面是一个空集合,而不是一个非空集合。语句没有类型,它们不会计算为任何类型、值或任何东西。你说的是没有类型的语句,好像有一个有类型的语句?@Esailija:我知道,但你说两个语句有相同的类型,这完全是不真实的!如果这不仅仅是为了我自己的自我放纵,我会使用它,但我认为其他阅读我代码的人可能会认为WTF:-在为这个成语辩护时,可以说程序员的意图是非常明显的。我说让他们学习:
public static <T> T trhow(RuntimeException e) {
  throw e;
}