どのように私は初期化する必要がないことでJavaを教えてくださいa
作業プログラムを持っていると私にエラーを与えないように?
int a;
boolean b = true;
while (true) {
if (b == false) {
System.out.print(a);
break;
} else {
b = false;
a = 5;
}
}
私ができない場合は、これはコンパイラが設計された方法である理由はありますか?
それは、このようなコンパイラを設計することは容易であったか、これはそのIの再構築に私のコードを確保するためのメカニズムですか?
これは、同じ問題ではない、この1
「エラー:変数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バイトコードに直接生成することを。