为什么我得到一个未声明的变量错误?

时间:2012-12-19 01:23:46

标签: java variables

即使我知道它已被声明并初始化,我仍然会收到此错误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);
}                        
}

5 个答案:

答案 0 :(得分:5)

你在minDist循环中声明for,所以它只存在于那里,你不能在循环之外使用它。

答案 1 :(得分:4)

您在for循环的范围内声明它。您需要将int minDist的声明移到该循环之外,与您正在执行printf的级别相同。

答案 2 :(得分: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

答案 3 :(得分:1)

你在循环中声明了minDist变量,因此该变量的范围仅限于循环的特定范围。

所以你无法在外面访问该变量。

答案 4 :(得分:0)

基本上,既然你说过

int minDist = dist[0];

for 循环中,它只存在于循环中。例如,

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时崩溃,因为简单地说,他们无法在for循环之外看到y。

要解决您的问题:只需在循环之外的某个地方声明minDist,它应该可以正常工作。