当然这应该是有效的Java?我的语法有些错误吗?
return (url != null) ? url : (throw new NotFoundException("No url"));
如果不是,我想我必须这样做:
if(url == null)
throw new NotFoundException("No url");
return url;
任何人都有更简洁的东西吗?
答案 0 :(得分:5)
因为你没有完成回报:
return <comparison> ? <value1> :(else) <value2>
在您的情况下,您正在履行value1
而不是value2
,而是您要抛出新的例外。
您的实际第一个代码将被翻译为
if (url != null) {
return url;
} else {
return throw new NotFoundException("No url"); //makes sense?
}
答案 1 :(得分:4)
三元运算符(从名称中可以清楚地看出)有三个参数。第一个是比较(其值转换为布尔值)。后两个必须共享一个类型(或者可以转换为相同类型),即整个语句类型的类型。
代码中的问题是throw new NotFoundException("No url");
是一个声明。语句没有值,因此,不要与其他任何类型共享类型。这就是为什么在三元运算符的第二个或第三个参数中不允许语句的原因。这里没关系,因为声明的部分恰好是一个抛出语句,但这是巧合。对于三元运算符一般来说,这两个值需要具有相同的值,因此不能是语句。
(请注意,在Java中,所有从java.lang.Object和java继承的对象都有特殊(和复杂)的转换规则,如果ConditionalExpression
中的两个值之一(因为它在语言中调用)定义)是一个原语,所以如果这两个参数都不是一个语句,它就会起作用。)
答案 2 :(得分:2)
它无效,因为它不符合BNF:
Expression:
Expression1 [ AssignmentOperator Expression1 ]
Expression1:
Expression2 [ Expression1Rest ]
Expression1Rest:
? Expression : Expression1
答案 3 :(得分:2)
是一种解决方法,如果你真的,真的喜欢succintness(我做!)。声明方法
public static <T> T trhow(RuntimeException e) {
throw e;
}
然后只需编写trhow(new MyException());
而不是throw new MyException();
。这个在三元运算符中推断你的类型有多好,我不确定,但也许你可以使用具体而不是泛型类型。
此外,如果您希望这适用于已检查的异常,则会更加麻烦。有一个习惯用法允许你在不声明的情况下抛出任何已检查的异常,但这样做会破坏它首先被检查的点。