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);
}                        
}
4

5 回答 5

5

您在循环minDist内声明for,因此它只存在于其中,您不能在循环外使用它。

于 2012-12-19T01:26:21.653 回答
4

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

于 2012-12-19T01:26:21.010 回答
2

始终考虑声明变量的范围,因为它决定了变量的可见性。

您在作为范围的 for 块中声明您的变量。然后你试图从你声明它们的范围之外引用这些变量。那是行不通的。

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

于 2012-12-19T01:29:34.753 回答
1

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

所以你不能在外面访问那个变量。

于 2012-12-19T01:46:58.883 回答
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 ,靠近开始的某个地方,它应该可以工作。

于 2012-12-19T02:10:06.920 回答