2016-11-06 3 views
0

Краткого описанияфайла в массив в JTable (индекс вне границ)

В настоящее время я пишу массивную (Для моего уровня квалификации) программу Java с моим первым пользовательским интерфейсом. Моя цель - заставить программу использовать пользовательский интерфейс, чтобы сохранить информацию о карьере в текстовом файле и позволить ему прочитать этот файл в JTable, эти два действия выполняются через JButtons.

Файл использует # между переменными и находится в следующем формате:

name#placeOfWork#description#highestSalary#lowestSalary#indexOfDegree#indexOfDegreeLevel and studYears#yearOfMatriculation# 

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


параметризованного конструктор Карьера в: (Карьера)

public final int[] ARR_STUDY_YEARS = { 0, 0, 1, 2, 4, 6, 10 }; 
public final String ARR_DEGREE[] = { "None", "Commerce", "Science", "Arts", "Computer Sciences", "Education", 
     "Medicine", "Engineering" }, 
     ARR_DEGREE_LEVEL[] = { "None", "Matriculent", "Undergraduate", "Associate", "Bachelor", "Masters", 
       "Doctorate" }; 

// Variables 
private String name, setting, description, degree, degreeLevel, qualification;; 
private int highestSalary, lowestSalary, avgSalary, sYears, matricYear; 

public Career(String name, String setting, String description, int highestSalary, int lowestSalary, 
     int degreeNo, int degreeLevelNo, int matricYear){ 
    this.name = name; 
    this.setting = setting; 
    this.description = description; 
    this.highestSalary = highestSalary; 
    this.lowestSalary = lowestSalary; 
    sYears = ARR_STUDY_YEARS[degreeLevelNo]; 
    degreeLevel = ARR_DEGREE_LEVEL[degreeLevelNo]; 
    degree = ARR_DEGREE[degreeNo]; 
    this.matricYear = matricYear; 
} 

Кодекс дает мне ошибку: (CareerUI)

JButton btnDisplay = new JButton("Display"); 

    btnDisplay.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 

      ArrayList<Career> careerList = new ArrayList<Career>(); 

      File file = new File("Careers.txt"); 

      try { 
       Scanner reader = new Scanner(file); 
       while (reader.hasNextLine()) { 
        String[] line = reader.nextLine().split("#"); 
        Career career = new Career(line[0], line[1], line[2], Integer.parseInt(line[3]), Integer.parseInt(line[4]), 
          Integer.parseInt(line[5]), Integer.parseInt(line[6]), Integer.parseInt(line[7])); 
       //^ This constructor is on line 200 

        careerList.add(career); 
       } 
       reader.close(); 
       String[][] cMatrix = new String[careerList.size()][6]; 
       String[] header = { "Name", "Setting", "Description", "Average Salary", "Tertiary Qual. Required", 
         "Qualification" }; 
       for (int i = 0; i < cMatrix.length; i++) { 
        for (int j = 0; j < cMatrix[i].length; j++) { 
         Career c = careerList.get(j); 
         cMatrix[i] = c.toTableSummary(); 
        } 
       } 
       JTable table = new JTable(cMatrix, header); 
       // table.set 
       table.setBounds(519, 53, 489, 437); 
       panel.add(table); 
      } catch (FileNotFoundException ex) { 
       System.out.println("There was an error while reading your file"); 
      } 

     } 
    }); 

Файл: (Careers.txt)

Chartered Accountant#Office#Balances finances#100000#80000#1#4#2017# 
Plumber#House Calls#Fixes Plumbing#50000#10000#0#0#2019# 
Doctor#Clinic#Treats illness#150000#50000#6#6#2016# 
Architect#Construction Firm#Designs Buildings#80000#50000#6#5#2018# 

Ошибка:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 
at career.CareerUI$3.actionPerformed(CareerUI.java:200) 

Update

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

public class ScanToArray { 
public static void main(String[] args) { 
    try { 
     Scanner scFile = new Scanner(new File("test.txt")); 
     int x = 0; 
     String[][] multi = new String[5][5]; 
     while (scFile.hasNextLine()){ 
      String[] next = scFile.nextLine().split("#"); 
      multi[x][0] = next[0]; 
      multi[x][1] = next[1]; 
      multi[x][2] = next[2]; 
      multi[x][3] = next[3]; 
      multi[x][4] = next[4]; 
      x++; 
     } 
     scFile.close(); 
     int ln = 0; 
     for (int i = 0; i < multi.length; i++) { 
      for (int j = 0; j < multi[i].length; j++) { 
       if(i>ln){ 
        System.out.println(); 
        ln = i; 
       } 
       System.out.print("|" +multi[i][j] +"|"); 
      } 
     } 
    } catch (FileNotFoundException e) { 
     JOptionPane.showMessageDialog(null, "Error: File not found"); 
    } 
} 
} 

Файл используется (test.txt)

0.0#0.1#0.2#0.3#0.4 
1.0#1.1#1.2#1.3#1.4 
2.0#2.1#2.2#2.3#2.4 
3.0#3.1#3.2#3.3#3.4 
4.0#4.1#4.2#4.4#4.4 

Выход:

|0.0||0.1||0.2||0.3||0.4| 
|1.0||1.1||1.2||1.3||1.4| 
|2.0||2.1||2.2||2.3||2.4| 
|3.0||3.1||3.2||3.3||3.4| 
|4.0||4.1||4.2||4.4||4.4| 

Going бездельничать и посмотреть, если я могу преобразовать, что в JTable, а затем попытаться где я ошибался.

Примечание: Я не спрашиваю, что такое arrayindexoutofbounds, я спрашиваю, почему именно этот код дает мне это.

+0

Итак, вы никогда не проверяли, какая строка вашего текстового файла вызывает это исключение? Зачем? – Tom

+0

@Tom Первая строка, которую моя программа пытается конвертировать, дает ошибку –

+1

Тогда ваша проблема не воспроизводится с информацией, которую вы дали использовать. Попытайтесь создать [mcve]. И если первая строка вызывает исключение, то распечатайте то, что на самом деле читает ваш код, поскольку это не то, что вы показали нам здесь (пример вашего текстового файла в порядке). – Tom

ответ

0
sYears = ARR_STUDY_YEARS[degreeLevelNo]; 
degreeLevel = ARR_DEGREE_LEVEL[degreeLevelNo]; 

Вы, скорее всего, не хотите использовать ту же переменную, что и индекс, для разных массивов.

+0

Причина, по которой я это делал, заключается в том, что определенные уровни обучения (например, докторская степень) используют определенное количество учебных лет (например, 10 лет) –

3

Есть несколько проблем с кодом:

(1) В 4-й строке вашего входа, есть седьмой индекс (если вы разделяете с #), который ломает, когда вы пытаетесь получить line[7], который будет бросить ArrayIndexOutOfBoundsException

Здания # 80000 # 50000 # 6 # 5 # 2017 #

(2) Вы не сможете разобрать 6-й элемент, используя Integer.parseInt(line[6]) как он бросает NumberFormatException

(3) Входные данные неверны даже в третьей строке, после разделения они имеют более 7 индексов, которые не генерируют никаких исключений (поскольку вы извлекаете до 7 индексов), но убедитесь, что правильные данные переданы как вход.

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