今さら気づいたこと

練習問題を解いてみたら、今になって気づいたことがあった。

import java.io.*;
public class AgeAverage	{
/** 二人の名前を年齢を入力すると、その人たちの年齢の
  *  平均を表示するプログラム
  */

private static String getname,getage,name1,name2;
private static int age1,age2;

  public static void main(String[] args)throws IOException
  {
	System.out.println("二人分の名前と年齢を入力して下さい");
	BufferedReader reader = new BufferedReader
			(new InputStreamReader(System.in));
//	String getname,getage,name1,name2;
//	int age1,age2;
	for(int i=0; i<2; i++){
		System.out.println((i+1) + "人目の名前を入力して下さい");
		getname = reader.readLine();
		System.out.println(getname + "さんの年齢を入力して下さい");
		getage = reader.readLine();
		if(i == 0){
			name1 = getname;
			age1 = Integer.parseInt(getage);
		}
		if(i == 1){
			name2 = getname;
			age2 = Integer.parseInt(getage);
		}
	}
	float ave = (age1 + age2) / 2F;
	System.out.println(name1 + "さんと" + name2
			+ "さんの年齢平均は" + ave + "です");
  }
}

最初、変数の宣言をfor文の前でしてたんだけど思い切りコンパイルエラーになった。なんだこれーと色々いじってみた結果、for文の中で変数が初期化(初期化というより代入?)してもそのfor文の外から見れば、その変数は初期化されていない扱いとなるっぽいことに気づいた。
クラス全体で使う変数を宣言する場合、フィールドにしなきゃだめなのかーと今さらながらの発見。小さなことなのかもしれないけど、こうやって自分で気づけたことが嬉しい。

訂正

フィールドの場合、初期化しなくても参照までの間どこかで値の代入や初期化がされていればコンパイル可能。
変数の場合、宣言から参照までの間で初期化、もしくは値の代入がされてなければコンパイルエラーとなる。繰り返し処理の中で代入するように記述してあっても、その繰り返し処理の外で参照される場合、コンパイルエラーとなる。
えあさんより指摘いただきました。まだ勘違い気味かもしれないけどorz