質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1369閲覧

ArrayIndexOutOfBoundsExceptionエラーと配列リストの出力

Momomo.

総合スコア22

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/06/19 11:27

編集2018/06/19 15:36

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
  1. 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);
という風に出力しているようでしたが、私の理解が間違っているのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2018/06/19 11:42

ファイルの中身はちゃんと読み取れているんでしょうか?
Momomo.

2018/06/19 11:47

読み取れていると思います。確認の仕方が分からないのですが。。。ファイルを選ぶ画面はきちんと出てきます。ファイルを選んで”開く”を押すところまでは正常に作動するのですが、”OK”を押した後に写真のエラーが出ます。
LouiS0616

2018/06/19 11:51

たぶん e = new Employee(temp[0],temp[1],temp[2]); で落ちてるので、この直前の行で temp を出力してみてください。
Momomo.

2018/06/19 11:59

直前の行にSystem.out.println(temp);を入力したところ[Ljava.lang.String;@6477463fと画面にプリントされました。これはどういう意味なのでしょうか…?
LouiS0616

2018/06/19 12:03 編集

配列を示していますので、正常な表示です。temp.lengthはどうなってます?
退会済みユーザー

退会済みユーザー

2018/06/19 12:07

docxはカンマ区切りではなくzipファイルなんだが
shun-K

2018/06/19 14:49

読み込んだファイルはどんな中身のファイルですか? e = new Employee(temp[0],temp[1],temp[2]);が怪しい気が。項目が3つに満たないデータ(「a,b」とか「a」とか空行とか)あったらエラーになりそう。
Momomo.

2018/06/19 15:16

LouiS0616さん:temp.lengthを出力したところ、3がプリントされました!
Momomo.

2018/06/19 15:18

asahina1979さん:申し訳ありません!違うファイルが選択されている状態でスクリーンショットを撮ってしまいました…実際にはcvsファイルです。
Momomo.

2018/06/19 15:19

shun-kさん:おっしゃる通りでした!項目が1つ少ない行があり、編集したところエラーが消えました…ありがとうございました
guest

回答1

0

ベストアンサー

配列リストを出力するとこのように表示されます。

Object#toStringのデフォルトの挙動です。

実際のcvsファイル内のデータは名前、名字、価格が書かれています。

そのため配列リストを出力する際には名前、名字、価格がプリントされることを期待しています。

Object#toStringをオーバーライドしてやれば良いです。

Java

1class Employee { 2 private String firstName_; 3 private String lastName_; 4 private int money_; 5 6 Employee(String firstName, String lastName, int money) { 7 this.firstName_ = firstName; 8 this.lastName_ = lastName; 9 this.money_ = money; 10 } 11 12 @Override 13 public String toString() { 14 return String.format( 15 "%s\t%s\t%s\n", firstName_, lastName_, money_ 16 ); 17 } 18}

適当に想像して組んだのでバグを仕込んでいるかもしれません。悪しからず。

投稿2018/06/19 15:48

編集2018/06/19 16:11
LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Momomo.

2018/06/19 16:08

今回もありがとうございます! 教えていただいた通りオーバーライドしたところ無事にプリントされました。 初心者なので教えていただくまでこのような方法は全く知りませんでした。 勉強させていただきました!感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問