[解決済み] 非voidメソッドにreturnステートメントがない場合のコンパイル
質問
という場面に遭遇しました。 非ボイドメソッド が欠落しています。 戻り ステートメントを使用しても、コードはコンパイルされます。 whileループの後のステートメントが 到達不能 (デッドコード)で、決して実行されることはないでしょう。しかし、なぜコンパイラは何かを返すことについて警告さえしないのでしょうか?あるいは、なぜ言語が無限ループを持つ非voidメソッドを許し、何も返さないのでしょうか?
public int doNotReturnAnything() {
while(true) {
//do something
}
//no return statement
}
whileループの中にbreak文(条件付きでも)を入れると、コンパイラは悪名高いエラーを訴えます。
Method does not return a value
をEclipseで、そして
Not all code paths return a value
をVisual Studioで実行します。
public int doNotReturnAnything() {
while(true) {
if(mustReturn) break;
//do something
}
//no return statement
}
これは、JavaとC#の両方に言えることです。
解決方法は?
<ブロッククオートなぜ言語が無限ループを持つ非voidメソッドを許し、何も返さないのでしょうか?
非ボイドメソッドのルールは を返すすべてのコードパスは、値を返さなければならない そして、このルールはあなたのプログラムでも満たされており、0個のコードパスのうち0個が値を返します。 このルールは、quot;すべての非ボイドメソッドは返すコードパスを持たなければならない"ではありません。
これによって、次のようなスタブメソッドを書くことができる。
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
これは非voidメソッドです。それは があります。 はインターフェイスを満たすために非voidメソッドでなければなりません。しかし、何も返さないからと言って、この実装を違法とするのは馬鹿げているように思えます。
あなたのメソッドが到達不可能な終点を持つのは
goto
(ただし
while(true)
は、より快適な書き方である。
goto
)の代わりに
throw
(の別の形式です)。
goto
は関係ありません。
なぜコンパイラは、何かを返すことについて警告すらしないのでしょうか?
なぜなら、コンパイラは、そのコードが間違っているという良い証拠を持たないからです。ある人がこう書きました。
while(true)
で、それをやった人は自分が何をしているかを知っていた可能性が高いと思われます。
C#の到達性解析について詳しく知りたいのですが、どこで読むことができますか?
このテーマに関する私の記事は、こちらをご覧ください。
そして、C#の仕様書を読むことも検討してみてください。
関連
-
[解決済み】Android Studio クラス org.codehaus.groovy.runtime.InvokerHelper を初期化できませんでした。
-
[解決済み】代入の左手は必ず変数 CharAt
-
[解決済み】Javaの".class期待値"
-
[解決済み】Android java.lang.IllegalStateException: Android java.lang.IllegalStateException: Could not execute method of the activity
-
[解決済み] intellijが自動配線リポジトリにタイプのBeanが見つからないと不正確な発言をする件
-
[解決済み] エラー - trustAnchors パラメータは空であってはなりません。
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み】return型を持つJavaメソッドがreturnステートメントなしでコンパイルされる。
-
[解決済み] Javaメソッドで無駄なリターンを避けるには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:配列または java.lang.Iterable のインスタンスに対してのみ反復処理を行うことができます。
-
[解決済み] java のクラス内のコンストラクタは、指定された型に適用できない
-
[解決済み】「java -cp」と「java -jar」の違い?
-
[解決済み】Eclipseで「公開型 <<classname>> は独自のファイルで定義する必要があります」エラー【重複あり
-
[解決済み】破損したjarファイル
-
[解決済み】純粋なJUnitテストにVisibleForTestingを使用する方法
-
[解決済み] java.sql.SQLException を取得しました。ResultSet が終了した後の操作は許可されません。
-
[解決済み】javaで無効な文字定数
-
[解決済み】Javaの".class expected "について
-
[解決済み】return型を持つJavaメソッドがreturnステートメントなしでコンパイルされる。