「エラー:変数aが初期化されていない可能性があります」です構文場合は、この中に本当に必要?

RHS:

どのように私は初期化する必要がないことでJavaを教えてくださいa作業プログラムを持っていると私にエラーを与えないように?

int a;
boolean b = true;
while (true) {
   if (b == false) {
       System.out.print(a);
       break;
   } else {
       b = false;
       a = 5;
   }
}

私ができない場合は、これはコンパイラが設計された方法である理由はありますか?

それは、このようなコンパイラを設計することは容易であったか、これはそのIの再構築に私のコードを確保するためのメカニズムですか?

これは、同じ問題ではない、この1

スティーブンC:

「エラー:変数aが初期化されていない可能性があります」です構文場合は、この中に本当に必要?

はい、それは必要です。Java言語仕様は、それを必要とします。これはで覆われているJLS 16 -確実な代入を

「それぞれのローカル変数(14.4)と、その値のいずれかのアクセスが発生した場合、すべての空白最後のフィールド(§4.12.4、§8.3.1.2)は間違いなく割り当てられた値を持たなければなりません。」


どのように私は初期化する必要がないことでJavaを教えてくださいa作業プログラムを持っていると私にエラーを与えないように?

あなたはJavaのことを伝えることはできません。あなたは、変数...または再構築コードを初期化する必要があります。


私ができない場合は、これはコンパイラが設計された方法である理由はありますか?

Javaコンパイラがあるのでしなければならない仕様を実装し、それ以外の場合は、適切なJavaコンパイラではありません。仕様では、それは誤りであると言います。

仕様はそれを言う理由は本当の問題です。そのコンパイラの作家が含ま困難を余儀なくされていないので、答えは定理証明のすべてのJavaコンパイラのコード。

  • あなたが与える例では、変数は常に初期化されますことを、プログラマには明白です。しかし、コンパイラはそれを確認する必要があります。これは、初期化されていない変数が持っているであろうから、絶対に確認する必要が未定義の振る舞いを。

  • 自動(無向)検証は複雑な作業です。複雑な手段より書き込みに(コンパイラ)コード、もっと(コンパイラ)バグ、エトセトラ。

  • この技術では、「芸術の状態は、」複雑なJavaコードのためのこの種の分析を行うまでではありません。

  • 変数が初期化されていることを検証がある(理論値)の場合があります数学的に不可能は

だから... ...賢明に... Java言語を指定した人は、プログラマに、この背中を押しました。あなたは変数がされるようにコードを記述する必要が間違いなく割り当てられた JLSで定めたルールに従って、使用前に。

そして、あまりにも第2の理由はそこにあります。JLSは、Javaコンパイラが受け入れることができなかったと仮定

   System.out.print(a);

場合だけと、それはそれ自身を満たすことができaました(常に)以前に初期化されました。今、JLSの同じバージョンを実装するために別の人(または異なる時間に同じ人)によって書かれた2つのJavaコンパイラを考えます。

  • コンパイラC1は、その把握することができa、常に初期化され、プログラムが有効であることを述べています。

  • コンパイラC2は、その把握することはできませんa常に初期化され、プログラムが無効であることを述べています。

私たちは今、2つのJavaコンパイラ持って表向きは JLSの同じバージョンを実装しますが、あなたのプログラム例(上記)が有効であるかどうかに反対します。それは単に理不尽です。


さらに複雑なものに、私は「明確な割り当て」チェックに似ている何かがまたちょうどロードされたJVMバイトコード検証を行わなければならないと思います。したがって、JLS明確な割り当てルールへの変更はJVMSへのリップルだろう、と潜在ためのJVMプラットフォームの動作に影響を及ぼす他のプログラミング言語やツール、コンパイルは/ JVMバイトコードに直接生成することを。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=222459&siteId=1
おすすめ