javaeclipse中的断点错误

时间:2016-05-02 02:21:45

标签: java arrays eclipse list sorting

大家晚上好。我正在做一项功课,我终于完成了。目前,唯一停止编译的是第42行的断点错误.Eclipse告诉我,变量“list”是未初始化的,但是,我无法找到发生这种情况的原因或原因。

该程序用于初始java中的家庭作业。它被设计为从名为names.txt的文本文件中导入名称列表,然后能够在界面中对它们进行排序,并且在尚未添加菜单时,我想要编译并确保其在之前工作我再改变一下。

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

public class Name {

   private String givenName;
   private int[]  ranks = new int[11];

   public static void main( String[] args ) {

      List<Name> list = new ArrayList<Name>();

      loadFile();

      System.out.println( list.get( 0 ).getPop( 0 ) );
   }

   private static void loadFile() {
      Scanner inputStream = null;
      String fileName = "names.txt";

      try {
         inputStream = new Scanner( new File( fileName ) );
      }
      catch (FileNotFoundException e) {
         System.out.println( "Error opening file named: " + fileName );
         System.out.println( "Exiting..." );
      }

      while ( inputStream.hasNextLine() ) {
         String line = inputStream.nextLine();
         String[] tokens = new String[0];
         String givenName = tokens[0];

         int[] numList = new int[tokens.length - 1];

         for ( int i = 1; i < tokens.length; i++ ) {
            numList[i - 1] = Integer.parseInt( tokens[i].trim() );
         }

         list.add( new Name( givenName, numList ) );
      }
   }

   // here we get the name for the
   public Name(String name, int[] popularityRanks) {
      givenName = name;

      for ( int i = 0; i < 11; i++ ) {
         ranks[i] = popularityRanks[i];
      }
   }

   public String getName() {
      return givenName;
   }

   public int getPop( int decade ) {
      if ( decade >= 1 && decade <= 11 ) {
         return ranks[decade];
      }
      else {
         return -1;
      }
   }

   public String getHistoLine( int decade ) {
      String histoLine = ranks[decade] + ": ";

      return histoLine;
   }

   public String getHistogram() {
      String histogram = "";

      for ( int i = 0; i < 11; i++ ) {
         histogram += ranks[i] + ": " + this.getHistoLine( i ) + "\n";
      }

      return histogram;
   }
}

此外,我使用列表来配置变量,但现在我对它感到非常后悔,因为我对多维数组感觉更舒服。由于这是与家庭作业相关的,我完全理解如果没有人想帮助我修复第二部分并给我一些代码来将列表更改为数组。

我已经烧坏了,只是想让它在这时编译。关于从哪里去的任何指示?

4 个答案:

答案 0 :(得分:1)

您的列表声明/初始化位于main中,您尝试从loadFile方法访问它。

只需将List<Name> list = new ArrayList<Name>();作为类变量移动(将其放在main上方),您的代码就应该编译。

例如:

public class Name {

   private String givenName;
   private int[]  ranks = new int[11];
   static List<Name> list = new ArrayList<Name>();

   public static void main( String[] args ) {

      loadFile();
   ......

答案 1 :(得分:0)

您要添加Name对象的位置不可见。最好将list作为loadFile()方法的引用传递,如下所示

loadFile(list); // Method call from the main().

并加载文件

private static void loadFile(List list) {
  // Your code
}

答案 2 :(得分:0)

我重新构建了修复范围和对象定义的代码。如果你的个人逻辑是正确的(我没有真正检查过),你应该得到你想要的输出)。

你似乎混淆的是对象和调用客户端。 Name私有类是一个私有对象,它在main方法中实例化。随后调用Name对象的公共方法。

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Solution {

    private static class Name{

        private final int items = 11;
        private String givenName;
        private int[] ranks;


        //Constructor
        public Name(String name, int[] popularityRanks) {
            givenName = name;
            ranks = new int[items];

            for (int i = 0; i < items; i++) {
                ranks[i] = popularityRanks[i];
            }
        }

        public String getName() {
            return givenName;
        }

        public int getPop(int decade) {
            if (decade >= 1 && decade <= items) {
                return ranks[decade];
            } else {
                return -1;
            }
        }

        public String getHistoLine(int decade) {
            String histoLine = ranks[decade] + ": ";

            return histoLine;
        }

        public String getHistogram() {
            String histogram = "";

            for (int i = 0; i < 11; i++) {
                histogram += ranks[i] + ": " + this.getHistoLine(i) + "\n";
            }

            return histogram;
        }
    }



    public static void main(String[] args) {

        List<Name> list = loadFile();

        System.out.println(list.get(0).getPop(0));
    }


    private static List<Name> loadFile() {
        List<Name> list = new ArrayList<>();
        Scanner inputStream = null;
        String fileName = "names.txt";

        try {
            inputStream = new Scanner(new File(fileName));
        } catch (FileNotFoundException e) {
            System.out.println("Error opening file named: " + fileName);
            System.out.println("Exiting...");
        }

        while (inputStream.hasNextLine()) {

            String line = inputStream.nextLine();
            String[] tokens = new String[0];
            String givenName = tokens[0];

            int[] numList = new int[tokens.length - 1];

            for (int i = 1; i < tokens.length; i++) {
                numList[i - 1] = Integer.parseInt(tokens[i].trim());
            }

            list.add(new Name(givenName, numList));
        }
        return list;
    }


}

答案 3 :(得分:0)

首先,我建议你在主要名单之外宣布你的名单, 其次,您希望在调用getPop之前填充列表。 看看你在哪里:

的System.out.println(list.get(0).getPop(0));

此时list.get(0)返回null,因为列表还没有被填充......并且从你的代码中getPop(0)将返回-1,所以上面的行基本上没有&#39;那意味着什么。

至于将列表转换为数组以使其成为多维&#34; .... 如果您知道如何声明它们,那么第一个列表也可以是多维&#34;例如

列表&gt; list = new ArrayList();

是一个二维数组列表。 像上面那样的第二个通用列表是灵活的,并且比数组具有巨大的优势,例如它们可以被动态修改;你可以在运行时改变它们的大小,而不像数组。

话虽如此,如果你想将列表转换为数组,你需要列表的类型和它的大小,然后使用toArray()方法很容易...就像这样:

String [] array = list.toArray(new String [list.size()]);