【问题标题】:Need help understanding scope of variables in Java需要帮助理解 Java 中的变量范围
【发布时间】:2014-03-10 06:20:30
【问题描述】:

我正在为学校做一个小程序,它读取数据文件并在控制台中输出结果。我在弄清楚为什么我的对象数组在我完成一个 while 循环后没有结转时遇到了问题。代码如下:

import java.io.*;
import java.util.*;

public class order{
    private static Node nodes[];

    public static void main(String[] args) throws FileNotFoundException {
        String dataFile = "file.dat";
        indegreeCompute(dataFile);
    }

    private static void indegreeCompute(String dataFile) throws FileNotFoundException {
        Scanner scanFile = new Scanner(new File(dataFile));
        nodes = new Node[scanFile.nextInt()];
        while (scanFile.hasNextLine()) {
            scanFile.nextLine();
            int index = scanFile.nextInt();
            System.out.print("node = " + index);
            scanFile.next();
            int NumOutDegree = scanFile.nextInt();
            nodes[index].outDegree = NumOutDegree;
            System.out.print(" outDegree = " + nodes[index].outDegree);
            nodes[index].adjNodes = new int[NumOutDegree];
            scanFile.next();
            System.out.print(" adjNodes = [");
            for ( int i = 0; i < nodes[index].outDegree; i ++ ) {
                nodes[index].adjNodes[i] = scanFile.nextInt();
                if (i < nodes[index].outDegree - 1)
                    System.out.print(nodes[index].adjNodes[i] + ", ");
                else
                    System.out.print(nodes[index].adjNodes[i]);
            }
            System.out.print("]");
            System.out.println();
        }

        for (int i = 0; i < nodes.length; i ++) {
            int outDegree = nodes[i].outDegree;
            for(int k = 0; k < outDegree; k ++) {
                int adjNode = nodes[i].adjNodes[k];
                nodes[adjNode].inDegree ++;
            }
        }
        scanFile.close();
    }
}

我遇到的具体问题是 for 循环的最后一部分。我正在尝试使用我在 while 循环中创建的数组中的信息,但是当我调试时,它显示我的节点数组具有错误的值。

辅助类就是这样:

public class Node {
    public static int inDegree, outDegree, adjNodes[];
}

任何有助于我理解的帮助或解释将不胜感激。谢谢!

这是文件的内容:

14 //numNodes; space after '(' and before ')' to simplify reading the file
 0 (  1 ): 10 //node ( outdegree ): adjNodes in arbitrary order
 1 ( 10 ):  0  5  8 10  6  9  7 11 12 13
 2 (  1 ):  7
 3 (  3 ):  1  10 11
 4 (  3 ):  0  1  5
 5 (  3 ):  6  7  10
 6 (  2 ):  7 10
 7 (  5 ):  8 10  12 11 13
 8 (  1 ): 13
 9 (  1 ):  0
10 (  0 ):
11 (  0 ):
12 (  2 ): 10 11
13 (  1 ): 12

【问题讨论】:

  • 你能发布topoOrder.dat的内容吗?
  • 程序的输出(第一个 for 循环)是否符合您的预期?
  • 是的,第一个循环的输出是完美的。我只是遇到了第二个循环的问题。

标签: java arrays class loops scope


【解决方案1】:

在将任何值分配给节点[index] 的属性之前,您应该设置 nodes[index] = new Node()。 Node 类的属性不应该是静态的,因为每个节点都应该有自己的值。

因为节点数组中的每个元素都将为空,除非您为其设置值。在您的代码中,当您为nodes[index].outDegree 设置值时,实际上是在设置Node.outDegree 的值,并且nodes[index] 仍然为空。所以最后,你会得到一个满是 null 的数组。

总而言之,这里有两个错误。错误使用静态关键字,忘记在使用前初始化对象数组的项。

【讨论】:

    【解决方案2】:

    以下内容应该适合您。

        public class Node {
         //public static  int inDegree, outDegree, adjNodes[]; // static was causing the problem
         public int inDegree, outDegree, adjNodes[];
        }
    
    
    public class order{
        private static Node nodes[];
    
        public static void main(String[] args) throws FileNotFoundException {
            String dataFile = "file.dat";
            indegreeCompute(dataFile);
        }
    
        private static void indegreeCompute(String dataFile) throws FileNotFoundException {
            Scanner scanFile = new Scanner(new File(dataFile));
            nodes = new Node[scanFile.nextInt()];
            for(int l= 0 ; l <nodes.length ; l++) {
                nodes[l] = new Node();
            }
            while (scanFile.hasNextLine()) {
                scanFile.nextLine();
                int index = scanFile.nextInt();
                System.out.print("node = " + index);
                scanFile.next();
                int NumOutDegree = scanFile.nextInt();
                nodes[index].outDegree = NumOutDegree;
                System.out.print(" outDegree = " + nodes[index].outDegree);
                nodes[index].adjNodes = new int[NumOutDegree];
                scanFile.next();
                System.out.print(" adjNodes = [");
                for ( int i = 0; i < nodes[index].outDegree; i ++ ) {
                    nodes[index].adjNodes[i] = scanFile.nextInt();
                    if (i < nodes[index].outDegree - 1)
                        System.out.print(nodes[index].adjNodes[i] + ", ");
                    else
                        System.out.print(nodes[index].adjNodes[i]);
                }
                System.out.print("]");
                System.out.println();
            }
    
            for (int i = 0; i < nodes.length; i ++) {
                int outDegree = nodes[i].outDegree;
                for(int k = 0; k < outDegree; k ++) {
                    int adjNode = nodes[i].adjNodes[k];
                    nodes[adjNode].inDegree ++;
                }
            }
            scanFile.close();
        }
    }
    

    问题在于辅助类中静态变量的使用。 你在那里使用了导致问题的班级成员。我已将它们更改为对象范围以了解类范围请阅读以下Class Members

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多