2016-05-02 4 views
1

Добрый вечер всем. Я работаю над домашним заданием, и, наконец, я почти закончил его. В настоящее время единственной остановкой компиляции является ошибка точки останова в строке 42. Eclipse говорит мне, что переменная «список» неинициализирована, однако я не могу найти, где и почему это происходит.Ошибки точки останова в javaeclipse

Программа предназначена для задания домашней работы в начале 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; 
    } 
} 

Кроме того, я использовал списки для настройки переменных, но теперь я глубоко сожалел об этом, как я чувствую себя намного более комфортно только с многомерными массивами. Поскольку это домашнее задание связано, я полностью понимаю, если никто не хочет помочь мне исправить эту вторую часть и дать мне код для изменения списков в массивы.

Я сгорел и хочу, чтобы он скомпилировался в этот момент. Любые указатели на то, куда идти отсюда?

+0

Я могу добавить names.txt, если это поможет, но я думаю, что это бесполезно для этого вопроса. –

+0

Можете ли вы добавить сообщение об ошибке и фрагмент файла names.txt. Сразу видно, что код плохо организован. – Clockwork

+0

Names.txt - это список имен с 11 целыми числами для их возможных рангов. A 83 140 228 286 426 612 486 577 836 0 0 Aaliyah 0 0 0 0 0 0 0 0 0 380 215 Аарон 193 208 218 274 279 232 132 36 32 31 41 Abagail 0 0 0 0 0 0 0 0 0 0 958 Аббатство 0 0 0 0 0 0 0 0 537 451 428 –

ответ

1

Ваше объявление/инициализация вашего списка в основном и вы пытаетесь получить к нему доступ из метода loadFile.

Просто переместите вас List<Name> list = new ArrayList<Name>(); как переменную класса (положите ее прямо над основным), и ваш код должен скомпилироваться.

Например:

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(); 
    ...... 
+0

Это вызвало еще одно в другом разделе. Обе области теперь ссылаются на то, что они не могут статически ссылаться на нестационарную переменную, а также на ту же строку, сообщающую ошибку точки останова ... –

+0

Вы видите код выше? 'static' –

+0

Вы - ученый и святой. Решаемые. Спасибо –

0

Ваш список не виден в точке вашего собираются добавить Name объект. Его лучше передать list в качестве ссылки на метод loadFile(), Как как следует

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

И загрузить файл

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

Я перестроенный код фиксирующую области действия и определение объекта. Если ваша индивидуальная логика правильная (что я действительно не проверял), вы должны получить желаемый результат).

Что вы, кажется, перепутали, это объект и вызывающий клиент. Закрытый класс Name является частным объектом, который создается в основном методе. Впоследствии вызываются публичные методы объекта 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; 
    } 


} 
+0

Спасибо за это! Меня беспокоит, что моя структура настолько плоха, что кто-то ушел с их пути, чтобы исправить это ... –

+0

Дело в том, что вам не нужно никому благодарить, просто примите ответ, который наилучшим образом отвечает вашим требованиям и голосует те, которые подошли близко. :) – Clockwork

0

Прежде всего, плохо советую вам объявить список за пределами основной, Во-вторых, вы хотите, чтобы заполнить список перед вызовом getPop. Посмотрите, что у вас есть:

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

В этот момент list.get (0) возвращает null, поскольку список еще не заполнен ... и из вашего кода getPop (0) вернет -1, поэтому строка выше в принципе ничего не значит в таком случае.

А что касается преобразования списка в массивы, чтобы сделать его «многомерным» .... Первые списки также могут быть «многомерными», если вы знаете, как их объявить ... e.g

Список> list = new ArrayList();

- 2-й список массивов. Вторичные общие списки, подобные приведенным выше, являются гибкими и обладают огромными преимуществами по сравнению с массивами, например, они могут быть динамически изменены; вы можете изменить их размер во время выполнения, в отличие от массивов.

С учетом сказанного, если вы хотите, чтобы преобразовать список в массив нужно тип списка и его размер, а затем легко с помощью метода ToArray() ... как это:

String [ ] array = list.toArray (новый String [list.size()]);

Смежные вопросы