2013-10-18 5 views
5

以下のコードを参照してください。 printTest()メソッドは、初期化されていない変数のデフォルト値を表示していますが、mainメソッドになると、javaは変数の初期化を要求しています。なぜ誰かが説明できますか?ローカル変数の場合、javaが変数の初期化を要求する理由

public class Test1 { 

    public static void main(String[] args) { 
     int j; 
     String t; 

     System.out.println(j); 
     System.out.println(t); 
    } 
    } 


    public class Test2 { 

    int i; 
    String test; 

    public static void main(String[] args) { 
    new Test().printTest(); 
    } 

    void printTest() { 
    System.out.println(i); 
    System.out.println(test); 
    } 

    } 
+2

Javaでは変数を使用する前に変数を初期化する必要があります –

+2

はい私は同意します。コードと私の質問を参照してください –

+0

何が起こると思いますか? –

答えて

11

ローカル変数は主に中間計算に使用されますが、インスタンス変数は将来の計算や中間計算のためのデータを保持することになっています。 Javaはインスタンス変数を初期化することを強制せず、デフォルト値を許可しますが、開発者が呼び出すローカル変数に対して値を設定します。したがって、間違いを避けるためには、ローカル変数を初期化する必要があります。

+0

最終的に本当の答えxD – RamonBoza

+0

Thanks Vineet、RamoBozaにも感謝 –

0

javaでローカル変数を初期化する必要があります。そのような単純な。ただし、値がない場合は、値をnullに設定できます。注意:intは単純なデータ型であり、値nullを持つことはできません。したがって、クラスをIntegerに変更しました。これは、intをラップするクラスです。

public class Test { 

    int i; 
    String test; 

    public static void main(String[] args) { 
     Integer j = null; 
     String t = null; 
     //other options for initialization value: 
     t = new String(); 
     t = ""; 

     System.out.println(j); 
     System.out.println(t); 

     new Test().printTest(); 
    } 

    void printTest() { 
     System.out.println(i); 
     System.out.println(test); 
    } 
} 
1

Java documentation for primitives

ローカル変数は若干異なります。コンパイラは初期化されていないローカル変数にデフォルト値を割り当てません。ローカル変数が宣言されている場所で初期化できない場合は、使用する前に値を割り当ててください。初期化されていないローカル変数にアクセスすると、コンパイル時にエラーが発生します。

+0

あなたはランタイムエラーを意味していませんか? –

2

これはコンパイラが知ることができる問題です。

メインメソッドの場合、コンパイラは変数が初期化されていないことを確認します。

しかし、printTestメソッドの場合、コンパイラは、クラス変数を初期化する他のメソッド(または同じパッケージクラス)である可能性があることを認識します。

0

私は、ローカル変数はJVMクラスローディングの一部としてメモリにロードされないため、これらの変数にデフォルト値は割り当てられていません。プリミティブには「null」という概念がないため、ローカル変数に明示的に値を割り当てる必要があります。

公開中!

2

グローバル変数はどこでも初期化されていませんでした。 var iを表示し、存在しない/存在しない値でテストしようとしています。 nullでもなく、0でも空白でもありません。

あなたの場合は(答えから:Uninitialized int vs Integer)これに少し似ている

i == 0; Uninitialized 
i == null; Undefined 
test == 0; java.lang.NullPointerException 
test == null; Uninitialized 

しかし、それはだときは、javaは変数の初期化を求めている主な方法になります。

iとtのローカル変数は、グローバル変数と同様です。

変数を初期化する必要があります。私は個人的には、変数を持つコンピューティングは初期値を持つ必要があるか、存在しないと考えています。

コンピュータは現在、計算/数学の物理的な使用に基づいているため、量子計算の新しい段階に入った場合を除き、Mathのルールはコンピュータにも適用されます。

数学では、変数は、与えられた問題または一連の操作の範囲内で変更される可能性のある値を指定する記号(通常はアルファベット文字)です。

(から:http://en.wikipedia.org/wiki/Variable_(mathematics)

そうでない既存の空= xは、私のために任意の値を持たない変数、そのルールと空されている与えられていないと、誰もそれを見ることはできませんので、虚しさを計算する既知の方法。

+0

よろしくお願いします。だから私はあなたに投票を入れました –

+0

Ashokkuttuvaありがとうございました! – RGAT

0

あなたのプログラムでは、変数がif-elseループで変数を使用したときに変数に値を指定する必要があります。プログラムがelseループに行くかどうかはわかります。 'sizeDisplay' sizeDisplayを "null"として初期化する必要があります。