2016-11-06 4 views
0

簡単な説明ファイル

私は現在、私の最初のUIを持つ大規模な(私のスキルレベルの場合)は、Javaプログラムを書いています。私の目標は、プログラムでUIを使用してキャリア情報をテキストファイルに保存し、そのファイルをJTableに読み込ませることです。これらの2つのアクションはJButtonを通じて実行されます。

ファイルは、変数間の#を使用した形式である:

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) 

更新

だけのコードは以下の通りです、多次元配列にテキストファイルを変換してテストを行なったし、それが働きました。私はこれを理解することに近いかもしれない。

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| 

が周りの混乱に行くと私は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)それは

をスローするようあなたは Integer.parseInt(line[6])を使用して第六要素を解析することができません

(3)入力データが3行目であっても正しくない。分割後に7個以上のインデックスがあり、7個までインデックスを取得しているので例外は発生しないが、正しいデータが入力。

関連する問題