java.lang.ArrayIndexOutOfBoundsExceptionというエラーが出て困っています。
作りたいプログラム:
ユーザーに下記の3つのメニューから1つを選んでもらいます。
a) ファイルを開く
b) ファイルを保存する
c) プログラムを終了する
ユーザーがaを選んだ場合にmainにあるJFileChooserを使ってファイルを選んでもらい、そこから別のクラスTheFileReaderでファイル内のデータ(テキスト)をArrayListに保存し、それを画面に表示させたいです。
実際に書いたプログラム:
1)MainProgram
java
1import java.util.ArrayList; 2import java.beans.FeatureDescriptor; 3import java.io.File; 4import java.util.Scanner; 5import javax.swing.JFileChooser; 6 7public class MainProgram { 8 public static void main(String[] args){ 9 Scanner sc = new Scanner(System.in); 10 11 System.out.println("Choose from the menu below"); 12 System.out.println("Menu:\na) Open a file\nb) Save the file\nc) Exit"); 13 String menu = sc.next(); 14 15 switch(menu.toLowerCase()){ 16 case "a": //Open file 17 JFileChooser jfc = new JFileChooser(); 18 int returnValue = jfc.showOpenDialog(null); 19 if (returnValue == JFileChooser.APPROVE_OPTION){ 20 File selectedFile = jfc.getSelectedFile(); 21 TheFileReader fr = new TheFileReader(); 22 display(fr.readFile(selectedFile)); 23 } 24 break; 25 26 case "b": //Save file 27 TheFileReader fr = new TheFileReader(); 28 //writeToFile(fr.readFile(selectedFile)); 29 30 break; 31 32 case "c": //Terminate program 33 System.out.println("-- End --"); 34 break; 35 36 default: 37 System.out.println("Invalid input."); 38 } 39 } 40 41 private static void display(ArrayList<Employee> list){ 42 CheckWriter cw = new CheckWriter(); 43 44 System.out.printf("First Name : Last Name : Money : Amount in Words\n"); 45 46 for(int i=0; i<list.size(); i++){ 47 System.out.println(list.get(i)); 48 System.out.println(); 49 } 50 } 51 52 private static void writeToFile(ArrayList<Employee> list){ 53 54 } 55 56} 57
- TheFileReader
java
1import java.io.File; 2import java.io.FileNotFoundException; 3import java.io.FileReader; 4import java.util.ArrayList; 5import java.util.List; 6import java.util.Scanner; 7import javax.swing.JFileChooser; 8import javax.swing.filechooser.FileSystemView; 9 10public class TheFileReader { 11 12 public static ArrayList<Employee> readFile(File list) { // I need to return an arrayList, so return al at line 49 13 14// cause my constructor name is Employee 15 ArrayList<Employee> al = new ArrayList<Employee>(); // al = arraylist 16 17 JFileChooser jfc = new JFileChooser(); 18 Employee e;// create an empty employee 19 20 String[] temp; // temp array for storing some data 21 Scanner s; 22 try { 23 s = new Scanner(new FileReader(list));// read a file that was inputed by user. 24 while (s.hasNextLine()) { 25 temp = s.nextLine().split(","); 26 27 e = new Employee(temp[0],temp[1],temp[2]); 28 al.add(e); // cause I need to input an employee constructor to my arraylist, e is my constructor name 29 } 30 s.close(); 31 32 } catch (FileNotFoundException ee) { 33 System.out.println("error: " + ee); 34 } 35 return al; 36 } 37} 38
疑問点:
エラーの意味を調べたところ ”配列のインデックスとして存在しない要素を指定した場合に発生するエラー” とのことでした。
しかし私はArrayではなくArrayListを使っています。 ArrayListは自由にサイズを変更できるものだと思います。(大きくしたり小さくしたり、、、)
それなのにどうしてこのようなエラーが表示されるのでしょうか?
また、TheFileReaderのクラスでtry{}catchを使って見ましたがそれでもエラーが消えません。
どうすればこのエラーが消え、ユーザーが選んだテキストファイル内のデータが正しくArrayListに保存されるようになりますか?
よろしくお願いします。
追記:
ファイルを選ぶ画面はきちんと出てきます。
下の画像の通り、ファイルを選んで”開く”をクリックすることはできるのですが、”開く”をクリックすると上の画像のようなエラーが出ます。
追記2(解決しました!):
可能性を示唆してくださった皆様本当にありがとうございました。
テキストファイル内のデータが1つ少ない行があり、そちらを編集したところエラーが消え正常に作動しました。おさげ様で助かりました。ありがとうございました!
問題2:
追加で問題が発生しました。
ArrayIndexOutOfBoundsExceptionエラーは消えたのですが、配列リストを出力するとこのように表示されます。
実際のcvsファイル内のデータは名前、名字、価格が書かれています。
そのため配列リストを出力する際には名前、名字、価格がプリントされることを期待しています。
この場合、配列リストにデータがきちんと保存されていないため出力した際にこのような結果になるのでしょうか?
それとも私の出力の仕方が間違っているのでしょうか?
ネット検索した際には多くの人が
配列リストの名前.get(index);
という風に出力しているようでしたが、私の理解が間違っているのでしょうか?
回答1件
あなたの回答
tips
プレビュー