首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 方法呼叫與區域變數作用域:為何 Arrays.sort 與 AA.sop(x) 編譯失敗

     編輯:程式設計疑難解答

錯誤程式碼重現

class BB {
    public void print1() {
        int[] arr = {1,2,3,4};
        for(int i : arr) { AA.sop(i); }
        Arrays.sort(arr);        // 錯誤 1
    }
    public void print2() {
        int x = 4;
    }
    AA.sop(x);                   // 錯誤 2
}

錯誤 1 分析:Arrays.sort(arr) 位置錯誤

Arrays.sort(arr) 寫在方法體之外、類別體內,屬於「宣告位置」,只能放欄位宣告、方法宣告、初始化區塊。執行陳述式必須在方法/建構子/靜態區塊內。

✅ 修正:移入 print1() 方法內,或寫在實例初始化區塊 { Arrays.sort(arr); }(但 arr 必須是欄位)。

錯誤 2 分析:AA.sop(x) 存取區域變數

x 是 print2() 的區域變數,作用域僅限該方法內。類別體直接呼叫 AA.sop(x) 看不見 x,編譯器報「找不到符號」。

✅ 修正:將 x 提升為欄位 private int x = 4;,或在 print2() 內呼叫 AA.sop(x)。

對比參考程式碼為何能跑

int[] arr1 = {3,1,2};
Arrays.sort(arr1); // 這行在 main 方法內!

參考碼的 Arrays.sort(arr1) 寫在 main 方法裡,屬合法執行陳述式位置。

核心概念圖解

位置可放內容範例
類別體欄位、方法、建構子、初始化區塊int x; void foo(){} {x=1;}
方法體執行陳述式、區域變數宣告int y=2; System.out.println(y);
區域變數作用域從宣告處到所在區塊結尾{ int z=3; } // z 在此失效

避坑清單

  1. 所有「會產生副作用的程式碼」必須在方法/建構子/區塊內。
  2. 區域變數不能跨方法存取,需提升為欄位或透過參數傳遞。
  3. IDE 紅線提示通常直接指出「Illegal start of expression」或「Cannot find symbol」,按提示移動程式碼即可。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved