2016-11-06 2 views
0

KurzbeschreibungDatei auf Array JTable (Index aus Bounds)

Ich bin derzeit ein massives (Für mein Skill-Level) Java-Programm mit meinem ersten UI zu schreiben. Mein Ziel ist es, dass das Programm die Benutzeroberfläche verwendet, um Karriereinformationen in einer Textdatei zu speichern und es zu ermöglichen, diese Datei in eine JTable zu lesen. Diese beiden Aktionen werden über JButtons ausgeführt.

Die Datei verwendet ein # zwischen Variablen und ist im Format:

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

Das Problem entstand, als ich versuchte, eine Karriere Konstruktor (Code unten) aus der Datei zu instanziiert durch die Linie in die Aufspaltung notwendigen Teile, ich habe keine Ahnung, wie das mir eine ArrayIndexOutOfBounds Ausnahme geben, wie es innerhalb des Arrays Grenzen zu sein scheint ...


Die parametrisierte Konstruktor Karriere: (Karriere)

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

Der Kodex mir einen Fehler geben: (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"); 
      } 

     } 
    }); 

Die Datei: (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# 

Der Fehler:

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

aktualisieren

nur ein Test war mit einer Textdatei in einem multidimensionalen Array konvertieren und es hat funktioniert, ist der Code unten. Vielleicht bin ich kurz davor, das herauszufinden.

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

Die Datei verwendet (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 

Der Ausgang:

|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| 

um zu verwirren und sehen, ob ich das in einem JTable und dann versuchen, konvertieren herauszufinden, wo ich anfangs falsch gelaufen bin.

Hinweis: Ich frage nicht, was ein Arrayindexoutofbounds ist, frage ich, warum dieser bestimmte Code gibt mir es.

+0

Sie haben also nie überprüft, welche Zeile Ihrer Textdatei diese Ausnahme verursacht? Warum? – Tom

+0

@Tom Die erste Zeile, die mein Programm zu konvertieren versucht gibt den Fehler –

+1

Dann ist Ihr Problem nicht reproduzierbar mit den Informationen, die Sie verwendet haben. Versuche ein [mcve] zu erstellen. Und wenn die erste Zeile die Ausnahme verursacht, dann drucken Sie, was Ihr Code tatsächlich liest, da dies nicht das ist, was Sie uns hier gezeigt haben (Ihr Textdateibeispiel ist in Ordnung). – Tom

Antwort

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

Wahrscheinlich möchten Sie nicht dieselbe Variable als Index für verschiedene Arrays verwenden.

+0

Der Grund dafür ist, dass bestimmte Studienniveaus (zB Doktorat) eine bestimmte Anzahl von Studienjahren verwenden (zB 10 Jahre) –

3

Es gibt einige Probleme mit Ihrem Code:

(1) In der vierten Zeile der Eingabe gibt 7.en Index ist (wenn Sie mit # geteilt), die bricht, wenn Sie versuchen, line[7] zu bekommen, die werfen ArrayIndexOutOfBoundsException

Gebäude # 80000 # 50000 # 6 # 5 # 2017 #

(2) Sie werden nicht in der Lage sein, das sechste Element zu analysieren mit Integer.parseInt(line[6]) wie es NumberFormatException

wirft

(3) Die Eingabedaten sind auch in der dritten Zeile nicht richtig, es hat mehr als 7 Indizes nach der Teilung, die keine Ausnahmen auslösen (wie Sie bis zu 7 Indizes abrufen), aber sicherstellen, dass korrekte Daten als übergeben werden Eingang.

Verwandte Themen