English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

tryで定義された変数はcatchで使用したり、Javaでfinalにすることができますか?

Javaのクラスには、静的(クラス)、インスタンス、ローカル変数の3種類の変数があります。

  • インスタンス変数-これらの変数はクラスのインスタンス(オブジェクト)に属しています。これらはクラス内でメソッドの外に宣言されています。これらはクラスをインスタンス化する際に初期化されます。これらは特定のクラスのどのメソッド、構築関数、またはブロックからもアクセスできます。

  • クラス/静的字段-クラス/静的字段はクラスに属しており、インスタンス変数と同じように、クラス内のメソッドの外で宣言されていますが、staticキーワードを使用して宣言されています。

    それらはコンパイル時にアクセスできます、インスタンス化の前に/クラスをインスタンス化しない場合にアクセスします、クラス全体で一つの静的字段のコピーが利用可能です、つまり、静的字段の値はすべてのオブジェクトで同じです。staticキーワードを使用して静的字段を定義できます。

  • ローカル変数-これらの変数はメソッドに属しています/ブロック/構築関数に在其中宣言/定義。これらの変数の範囲はメソッド(またはブロックまたは構築関数)内に位置し、実行後に破棄されます。

tryブロック内の変数

したがって、tryブロック内で変数を宣言するとき(これも特定のブロックの内部であればどのブロックでも同じです)、その変数はその特定のブロックのローカルに位置し、そのブロックの実行後にその変数のライフサイクルが終了します。したがって、外部のブロックで宣言された変数にアクセスすることはできません。

以下の例では、resultという変数を宣言し、finallyブロックでそのアクセスを試みますが、コンパイル時にコンパイル時エラーが発生します。

import java.util.Arrays;
import java.util.Scanner;
public class ExceptionExample {
   public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      int[] arr = {10, 20, 30, 2, 0, 8};
      System.out.println("Array: ",+Arrays.toString(arr));
      System.out.println("Choose numerator and denominator (not 0) from this array (enter positions 0 to 5)");
      int a = sc.nextInt();
      int b = sc.nextInt();
      try {
         int result = (arr[a])/(arr[b]);
      } catch(Exception e) {
         System.out.println("exception occurred");
      } finally {
         System.out.println("This is finally block");
         System.out.println("Result of ",+arr[a]+"/"+arr[b]+: "+result);
      }
   }
}

出力結果

ExceptionExample.java:21: error: symbol not found
      System.out.println("Result of ",+arr[a]+"/"+arr[b]+: "+result);
                                                            ^
   symbol: variable result
   location: class ExceptionExample
1 エラー