[解決済み】return型を持つJavaメソッドがreturnステートメントなしでコンパイルされる。
質問
質問1:
次のコードは、なぜ return 文がなくてもコンパイルできるのでしょうか?
public int a() {
while(true);
}
お知らせ whileの後にreturnを追加すると
Unreachable Code Error
.
質問2.
一方、次のようなコードはなぜコンパイルできるのでしょうか。
public int a() {
while(0 == 0);
}
はそうでないにもかかわらず
public int a(int b) {
while(b == b);
}
解決方法は?
<ブロッククオート質問1:
次のコードは、なぜ return 文がなくてもコンパイルできるのでしょうか?
public int a()
{
while(true);
}
でカバーされています。 JLS§8.4.7 :
メソッドが戻り値の型を持つと宣言されている場合 (§8.4.5) 、メソッドの本体が正常に完了できる場合はコンパイル時エラーが発生します (§14.1) 。
言い換えれば、戻り値の型を持つメソッドは、値の戻り値を提供する return 文を使用してのみ戻らなければなりません。メソッドは、"その本体の終わりを落とすことは許されません"。メソッド本体の return 文に関する正確な規則については、§14.17 を参照してください。
メソッドが戻り値の型を持ちながら、戻り値のステートメントを含まないことも可能です。以下はその一例です。
class DizzyDean { int pitch() { throw new RuntimeException("90 mph?!"); } }
コンパイラは、ループが決して終了しないことを知っているので (
true
は常に真です)、この関数は普通に戻ることができない(本体の最後を落とす)ことも知っています。
return
.
質問2:
一方、次のようなコードはなぜコンパイルできるのでしょうか。
public int a()
{
while(0 == 0);
}
はそうでないにもかかわらず
public int a(int b)
{
while(b == b);
}
での
0 == 0
の場合、コンパイラはループが決して終了しないことを知っています(その
0 == 0
は常に真となる)。しかし、それは
はしない。
は、そのことを
b == b
.
なぜダメなのか?
コンパイラは 定数式 (§15.28) . 引用元 §15.2 - 表現の形式 (奇妙なことにこの文は§15.28にないので) :
式の中には、コンパイル時に決定できる値を持つものがあります。これらは 定数式 (§15.28).
あなたの中の
b == b
の例では、変数が関係しているため、定数式ではなく、コンパイル時に決定される仕様になっていません。
私たち
は、この場合、常に真になることがわかります(ただし、もし
b
は
double
として、QBrute
ご指摘
で簡単に騙される。
Double.NaN
である。
ではない
==
そのもの
しかし、JLSは定数式がコンパイル時に決定されることを規定しているだけで、コンパイラが非定数式を評価しようとすることを許可していません。 bayou.io
いいこと言うね
ということです。もし、コンパイル時に変数を含む式を決定しようとする道を進み始めたら、どこで止めるのですか?
b == b
は明らかです(えー、非
NaN
の値)はどうでしょうか?
a + b == b + a
? または
(a + b) * 2 == a * 2 + b * 2
? 定数で線引きするのは理にかなっている。
つまり、式を決定しないので、コンパイラはループが決して終了しないことを知らないので、メソッドが普通に戻れると考えてしまうのです。
return
. そのため
return
.
関連
-
[解決済み] No enclosing instance of type Foo is accessible "というエラーの原因と対処法を教えてください。
-
[解決済み] 非voidメソッドにreturnステートメントがない場合のコンパイル
-
[解決済み] ファイルを作成せずに、ファイルが存在するかどうかをチェックする
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] Eclipseにプロジェクトをインポートした後に「Must Override a Superclass Method」エラーが発生する。
-
[解決済み] Eclipseが起動できない - Javaは起動したが終了コード=13を返した
-
[解決済み] メソッドの戻り値の型を汎用的にするにはどうすればよいですか?
-
[解決済み] YAMLです。YAML の文字列には引用符が必要ですか?
-
[解決済み] java 8で型変換を行うreduceメソッドにcombinerが必要な理由
-
[解決済み] 三項演算子でint型としてnullを返すことはできるがif文では不可
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 非voidメソッドにreturnステートメントがない場合のコンパイル
-
[解決済み] maven. -source 1.5ではラムダ式がサポートされていません。
-
[解決済み] パラメータ[変数]の不正な修飾子;finalのみが許可される[closed]。
-
[解決済み] java.lang.IncompatibleClassChangeError: Mongo クラスを実装しています。
-
[解決済み] java.util.concurrent.ExecutionException 例外をどのように処理しますか?
-
[解決済み] 要素 'beans' の宣言が見つかりません。
-
[解決済み] JAVA_OPTIONS、JAVA_TOOL_OPTIONS、JAVA_OPTSの違いについて
-
[解決済み] HTTP ステータス 500 - サーブレットクラス pkg.coreServlet のインスタンス化に失敗しました。
-
[解決済み] javaでメソッドを呼び出すプログラムのエラー修正
-
[解決済み] Javaコンパイラーエラー:ステートメントではありません