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

三項演算子は(その名前から明らかなように)3つの引数を取ります。1つ目は比較です(その値はブール値に変換されます)。次の2つは、タイプを共有する(または同じタイプに変換可能)必要があります。つまり、ステートメント全体のタイプであるタイプです。

コードの問題は、それthrow new NotFoundException("No url");がステートメントであるということです。ステートメントには値がないため、タイプを他のものと共有しないでください。これが、三項演算子の2番目または3番目の引数でステートメントが許可されない理由です。ステートメントである部分はたまたまthrowステートメントであるため、ここでは問題ではありませんが、それは偶然です。三項演算子が一般的に意味をなすためには、2つの値が同じ値である必要があるため、ステートメントにすることはできません。

ConditionalExpression(Javaでは、すべてのオブジェクトがjava.lang.Objectを継承し、 (言語定義で呼び出される)aの2つの値のいずれかがプリミティブである場合、javaには変換に関する特別な(そして複雑な)ルールがあることに注意してください。2つの引数はどちらもステートメントではなく、機能します。)

于 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 に答える