0

以下は私が混乱しているコードスニペットです。メソッドのreturnタイプはintであるため、メソッドはnullを返すことができません。しかし、最初のreturnステートメントのコメントを外して2番目のreturnステートメントにコメントすると、メソッドはエラーを表示しません。警告。その背後にある理由がわかりません。Javaバージョン7を使用しています。

 protected int calculateLogicalPageRangeForTitles(String logicalpage) throws Exception {
     //return StringUtils.isNumeric(logicalpage) ? Integer.parseInt(logicalpage) : null;
     return null;
 }
4

7 に答える 7

3

コードは合法であり、コンパイルされます。

Java仕様を参照してください:http: //docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.25

2番目と3番目のオペランドの1つがnull型で、もう1つの型が参照型である場合、条件式の型はその参照型です。

これは、?:の結果が整数になり、intにボックス化されないことを意味します。このボックス化解除により、NullPointerExceptionがスローされます。

于 2013-01-22T13:31:25.033 に答える
1

このステートメントは。のみを返しますint。をparseInt返しint0int

return StringUtils.isNumeric(logicalPage) ? Integer.parseInt(logicalPage) : 0;
于 2013-01-22T12:43:39.033 に答える
1

最初のreturnステートメント

return StringUtils.isNumeric(logicalPage) ? Integer.parseInt(logicalPage) : 0;

常にint値(または例外)を返します。このメソッドInteger.parseInt()は、プリミティブint値も返します。したがって、エラーや警告は表示されません。

ただし、2番目のステートメント

return null;

プリミティブ戻り型のnull値を返そうとしますが、これは無効であるため、コンパイラエラーが発生します。int

于 2013-01-22T12:44:24.603 に答える
0

これは、 parseIntがメソッドのシグネチャと一致するint(プリミティブ型)を返すためです。

null一方、プリミティブintとは互換性がないため、エラーが発生します。

于 2013-01-22T12:43:46.153 に答える
0

最初のステートメントは常に。を返す​​ためintです。だからそれはコンパイルします。

しかし、2番目のステートメントはタイプnullのどちらかを返します。リターンタイプがの代わりにあるObject場合、これはコンパイルされますIntegerint

于 2013-01-22T12:43:47.173 に答える
0

intはプリミティブです...したがって、値が必要です。nullは、(クラスへの)参照がどのインスタンスも参照していないことを示す値です。

于 2013-01-22T12:44:42.563 に答える
0

最初の行も無効です。falseであることが判明し、null値を返そうとすると、例外が発生します。

コードを詳細なifステートメントに書き出すと、エラーが発生します。好き:

if (StringUtils.isNumeric(logicalpage){
    return Integer.parseInt(logicalpage);
}else{
    return null;
}
于 2013-01-22T13:00:53.993 に答える