為什麼在Java中,在try塊中定義的變數不能在catch或finally塊中使用?


Java中的類將包含三種變數,即靜態(類)變數、例項變數和區域性變數。

  • 例項變數 − 這些變數屬於類的例項(物件)。它們在類中宣告,但在方法之外。當類被例項化時,它們會被初始化。可以從該特定類的任何方法、建構函式或塊中訪問它們。

  • 類/靜態變數 − 類/靜態變數屬於類,就像例項變數一樣,它們在類中宣告,在任何方法之外,但使用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 occured");
      } finally {
         System.out.println("This is finally block");
         System.out.println("Result of "+arr[a]+"/"+arr[b]+": "+result);
      }
   }
}

輸出

ExceptionExample.java:21: error: cannot find symbol
      System.out.println("Result of "+arr[a]+"/"+arr[b]+": "+result);
                                                            ^
   symbol: variable result
   location: class ExceptionExample
1 error

更新於: 2020年7月2日

6K+ 瀏覽量

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.