2012-12-19 45 views
0

即使我知道它已被聲明和初始化,我仍然收到此錯誤cannot find symbol - variable minDist。我覺得它直直地盯着我。有誰知道爲什麼會發生這種情況?爲什麼我得到一個可變的未聲明的錯誤?

還有另一個類文件,與此同時,但我不認爲這個錯誤在那裏。

我得到它的倒數第三行,當我到minDist,但如果我刪除minDist我也得到它minCostminMPG爲好。

public class AnnualFuelUseTester 
{ 
    public static void main(String[] args) 
    { 
    int sMiles1, sMiles2, sMiles3, sMiles4; 
    int eMiles1, eMiles2, eMiles3, eMiles4; 
    int[] dist = new int[4]; 
    double gals1, gals2, gals3, gals4; 
    double[] MPG = new double[4]; 
    double price1, price2, price3, price4; 
    double[] cost = new double[4]; 

    AnnualFuelUse[] fillUps = {new AnnualFuelUse(108438, 108725, 13.9, 2.98), 
           new AnnualFuelUse(108738, 109023, 15.3, 3.02), 
           new AnnualFuelUse(109023, 109232, 10.3, 3.05), 
           new AnnualFuelUse(109564, 109854, 13.1, 3.03)}; 

    for(int i = 0; i < fillUps.length; i++) 
    { 
     dist[i] = fillUps[i].calcDistance(); 
     MPG[i] = fillUps[i].calcMPG(); 
     cost[i] = fillUps[i].calcCost(); 
    } 
    for (int i = 0; i < dist.length; i++) 
    { 
     int maxDist = 0; 
     int minDist = dist[0]; 
     if (dist[i] > maxDist) 
     { 
      maxDist = dist[i]; 
     } 
     if (dist[i] < minDist) 
     { 
      minDist = dist[i]; 
     } 
    } 
    for (int i = 0; i < dist.length; i++) 
    { 
     double maxMPG = 0; 
     double minMPG = MPG[0]; 
     if (MPG[i] > maxMPG) 
     { 
      maxMPG = MPG[i]; 
     } 
     if (MPG[i] < minMPG) 
     { 
      minMPG = MPG[i]; 
     } 
    } 
    for (int i = 0; i < dist.length; i++) 
    { 
     double maxCost = 0; 
     double minCost = cost[0]; 
     if (cost[i] > maxCost) 
     { 
      maxCost = cost[i]; 
     } 
     if (cost[i] < minCost) 
     { 
      minCost = dist[i]; 
     } 
    } 

    System.out.printf("%15s%15s%15s%15s%15s%15s%15s%15s%15s\n\n" 
         ,"Fill Up", "Days", "Start Miles", "End Miles" 
         ,"Distance", "Gallons Used", "MPG", "Price", "Cost"); 
    for(int i = 0; i < fillUps.length; i++) 
    { 
     System.out.printf("%15s%15s%15s%15s%15s%15s%15.2f%15s%15.2f\n" 
          ,(i+1),(int)(1 + i *(i*1.1)), fillUps[i].getmySMiles() 
          ,fillUps[i].getmyEMiles(), dist[i] 
          ,fillUps[i].getmyGals(), MPG[i] 
          ,fillUps[i].getmyPrice(), cost[i]); 
    } 
    System.out.printf("%10s%10s%30s%30s","Minimum",minDist,minMPG,minCost); 
}       
} 
+0

非常感謝快速回復的傢伙。我要走出一個不好的在線高中教育,所以我學到的大約一半是通過實驗學到的。 – user1914491

+0

[這會幫助你理解變量的範圍](http://www.java-made-easy.com/variable-scope.html) – Smit

回答

4

你聲明它在for循環的範圍內。您需要將該循環之外的int minDist聲明移至與您正在執行printf相同的級別。

5

你在for循環中聲明瞭minDist,所以它只存在於那裏,並且你不能在循環之外使用它。

2

始終考慮聲明變量的範圍,因爲它決定了變量的可見性。

你在一個作爲範圍的for-block中聲明你的變量。然後你試圖從你聲明它們的範圍之外引用這些變量。這是行不通的。

public void foo() { 

    while (someBool) { 

     int someVariable = 0; 

     someVariable = 1 // works because using and declaring takes place in the same scope. 

    } 

someVariable = 2; // that won't work because variable is not existent in this scope. 

} 

還要考慮範圍可分層結構意味着在某些範圍內聲明的變量也是可見的所有嵌套的範圍內:

public void foo() { 

    while (someBool) { 

     int aVariable = 0; 

     if (anotherBool) { 

      aVariable = 1; // works because this scope is a nested scope inside the scope where the variable has been declared. 

     } 
    } 
} 

你會發現大量的有關範圍的衆所周知的概念它不僅在C#中使用,而且在大多數編程語言中使用。

一個點開始你的研究可能是MSDN文檔:

http://msdn.microsoft.com/en-us/library/aa691132(v=vs.71).aspx

1

你宣佈循環內minDist變量,該變量的範圍僅限於特定的for循環。

所以你不能訪問外面的變量。

0

基本上,既然你說

int minDist = dist[0]; 
循環

,它只在你的循環存在。例如,

for(int i = 0; i < 10; i++) { 
    int x = 0; 
} 
System.out.println(x); 

會返回一個錯誤,因爲x不在那個循環之外。它被稱爲範圍,基本上是不同級別的隱形。想象一下,電影 - 第二級夢中的人知道第一級夢是什麼,但第一級不能看到第二級。因此:

int x = 5; 
for(int i = 0; i < 1; i++) { 
    x = 3; 
    int y = 10; 
} 
System.out.println(x); 
System.out.println(y); 

會打印出3成功,但崩潰時,它試圖打印出y方法,因爲簡單地說,他們不能看到Y的外面循環。

要解決您的問題:只需在循環之外聲明minDist,在開始附近的某個地方應該可以工作。

相關問題