- ベストアンサー
[JAVA]try 内の変数を外で!?
お世話になります! try{ int rsCount = ... ... }catch(Exception e){ ... } out.println(rsCount); とした場合、初期化されていない可能性があるとかで使えません。 try catch 内で定義したものは使えないのですか?? 反対に、どうすれば解決できますか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
質問内容に関してはほぼ解決してるかと思いますが、#3のhidebu-さんの回答にちょっとツッコミを。 自動的に初期化されるのは、基本型、オブジェクト型によらず、インスタンス変数とクラス変数です。ローカル変数は初期値を持ちません。 例えば、以下のテストプログラムを実行すると、localObj, localIntを使う行でのみコンパイルエラーが出るはずです。 (「変数~は初期化されていない可能性があります」という内容) public class Test { Object instanceObj; // nullで初期化 int instanceInt; // 0で初期化 static Object staticObj; // nullで初期化 static int staticInt; // 0で初期化 public void init() { Object localObj; // 不定 int localInt; // 不定 System.out.println(instanceObj); System.out.println(instanceInt); System.out.println(staticObj); System.out.println(staticInt); System.out.println(localObj); // コンパイルエラー System.out.println(localInt); // コンパイルエラー } } また、オブジェクト型のローカル変数を何も考えずnullで初期化するという方法はあまりおすすめできません。 コンパイルエラーは「この変数、何も値が入ってないかもしれないんで使っちゃまずいよ」という意味でメッセージを出しているのに、このチェックを効かなくしてしまうからです。
その他の回答 (3)
- hidebu-
- ベストアンサー率53% (45/84)
JAVAの言語仕様で宣言された変数の有効範囲は、宣言をしたブロック内となっています。 ですから try節の中で宣言された変数はtry節を抜けると無効となってしまいます。 if文やFor文も同じです。 ですからメソッド内全ての個所で参照したい変数であれば、メソッドの先頭にまとめて宣言、初期化しておくとメソッド内のどこからでももんだいなく参照できます。 #2がいわれるオブジェクト型変数がなぜ明示的に初期化が必要かというとint型やchar型などの基本型変数は宣言とともに自動的に初期化されるのですが(int型には0、char型には\u0000が入る)、オブジェクト型変数は参照型変数に分類され、初期化したからといってNULLポインタがはいるわけではないのです。 ですからオブジェクト型変数を宣言するときは java.lang.String strValue = null; とか java.sql.Connection con = null; のようにメソッドの先頭で宣言すると同時に Nullポインタを代入しておき、 実際にインスタンスを作成したい個所で strValue = new String("テスト"); や con = java.sql.DriverManager.getConnection("****"); のようにインスタンスを作成すれば余計なバグになやまされることもなくなるとおもいます。 がんばってください。
- tomo-yuki
- ベストアンサー率39% (11/28)
オブジェクトは宣言だけでなく代入もtryブロックの外で行う必要があったような気がします。 String str = ""; try{ str = ... ... catch(Exception e){ ... } out.println(str);
ブロックの中で宣言した変数はその中でしか使えないようです。 >反対に、どうすれば解決できますか? int rsCount; try{ rsCount = ... ... }catch(Exception e){ ... } out.println(rsCount); と言う風にすれば使える様になると思います。