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

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

ただいまの
回答率

90.51%

  • Java

    13788questions

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

  • 配列

    522questions

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

  • ファイル

    170questions

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

  • ファイルI/O

    38questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 217

Momomo.

score 16

java.lang.ArrayIndexOutOfBoundsExceptionというエラーが出て困っています。

作りたいプログラム:
ユーザーに下記の3つのメニューから1つを選んでもらいます。
a) ファイルを開く
b) ファイルを保存する
c) プログラムを終了する
ユーザーがaを選んだ場合にmainにあるJFileChooserを使ってファイルを選んでもらい、そこから別のクラスTheFileReaderでファイル内のデータ(テキスト)をArrayListに保存し、それを画面に表示させたいです。

実際に書いたプログラム:
1)MainProgram

import java.util.ArrayList;
import java.beans.FeatureDescriptor;
import java.io.File;
import java.util.Scanner;
import javax.swing.JFileChooser;

public class MainProgram {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);

        System.out.println("Choose from the menu below");
        System.out.println("Menu:\na) Open a file\nb) Save the file\nc) Exit");
        String menu = sc.next();

        switch(menu.toLowerCase()){
        case "a": //Open file
            JFileChooser jfc = new JFileChooser();
            int returnValue = jfc.showOpenDialog(null);
            if (returnValue == JFileChooser.APPROVE_OPTION){
                File selectedFile = jfc.getSelectedFile();
                TheFileReader fr = new TheFileReader();
                display(fr.readFile(selectedFile));
            }
            break;

        case "b": //Save file
            TheFileReader fr = new TheFileReader();
            //writeToFile(fr.readFile(selectedFile));

            break;

        case "c": //Terminate program
            System.out.println("-- End --");
            break;

        default:
            System.out.println("Invalid input.");
        }
    }

    private static void display(ArrayList<Employee> list){
        CheckWriter cw = new CheckWriter();

        System.out.printf("First Name : Last Name : Money : Amount in Words\n");

        for(int i=0; i<list.size(); i++){
            System.out.println(list.get(i));
            System.out.println();
        }
    }

    private static void writeToFile(ArrayList<Employee> list){

    }

}

2) TheFileReader

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileSystemView;

public class TheFileReader {

    public static ArrayList<Employee> readFile(File list) {  //  I need to return an arrayList, so return al at line 49

//        cause my constructor name is Employee
        ArrayList<Employee> al = new ArrayList<Employee>(); // al = arraylist

        JFileChooser jfc = new JFileChooser();
        Employee e;// create an empty employee 

            String[] temp; // temp array for storing some data
            Scanner s;
            try {
                s = new Scanner(new FileReader(list));// read a file that was inputed by user.
                while (s.hasNextLine()) {
                    temp = s.nextLine().split(",");

                    e = new Employee(temp[0],temp[1],temp[2]);
                    al.add(e); // cause I need to input an employee constructor to my arraylist, e is my constructor name
                }
                s.close();

            } catch (FileNotFoundException ee) {
                System.out.println("error: " + ee);
            }        
        return al;
    }
}

エラー表示:
イメージ説明

疑問点:
エラーの意味を調べたところ ”配列のインデックスとして存在しない要素を指定した場合に発生するエラー” とのことでした。
しかし私はArrayではなくArrayListを使っています。 ArrayListは自由にサイズを変更できるものだと思います。(大きくしたり小さくしたり、、、)
それなのにどうしてこのようなエラーが表示されるのでしょうか?
また、TheFileReaderのクラスでtry{}catchを使って見ましたがそれでもエラーが消えません。
どうすればこのエラーが消え、ユーザーが選んだテキストファイル内のデータが正しくArrayListに保存されるようになりますか?
よろしくお願いします。

追記:
ファイルを選ぶ画面はきちんと出てきます。
下の画像の通り、ファイルを選んで”開く”をクリックすることはできるのですが、”開く”をクリックすると上の画像のようなエラーが出ます。
イメージ説明

追記2(解決しました!):
可能性を示唆してくださった皆様本当にありがとうございました。
テキストファイル内のデータが1つ少ない行があり、そちらを編集したところエラーが消え正常に作動しました。おさげ様で助かりました。ありがとうございました!

問題2:
追加で問題が発生しました。
ArrayIndexOutOfBoundsExceptionエラーは消えたのですが、配列リストを出力するとこのように表示されます。
イメージ説明

実際のcvsファイル内のデータは名前、名字、価格が書かれています。
そのため配列リストを出力する際には名前、名字、価格がプリントされることを期待しています。
イメージ説明

この場合、配列リストにデータがきちんと保存されていないため出力した際にこのような結果になるのでしょうか?
それとも私の出力の仕方が間違っているのでしょうか?
ネット検索した際には多くの人が
配列リストの名前.get(index);
という風に出力しているようでしたが、私の理解が間違っているのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Momomo.

    2018/06/20 00:16

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

    キャンセル

  • Momomo.

    2018/06/20 00:18

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

    キャンセル

  • Momomo.

    2018/06/20 00:19

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

    キャンセル

回答 1

checkベストアンサー

+1

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

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

実際のcvsファイル内のデータは名前、名字、価格が書かれています。
そのため配列リストを出力する際には名前、名字、価格がプリントされることを期待しています。

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

class Employee {
    private String firstName_;
    private String lastName_;
    private int money_;

    Employee(String firstName, String lastName, int money) {
        this.firstName_ = firstName;
        this.lastName_  = lastName;
        this.money_     = money;
    }

    @Override
    public String toString() {
        return String.format(
            "%s\t%s\t%s\n", firstName_, lastName_, money_
        );
    }
}

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/20 01:08

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

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    国旗を表示させたい(続き)

    前提・実現したいこと btn [0][1][2]をクリックすると、それに対応した国旗が表示されるようにしたい。 ソースコード import java.awt.*;   

  • 受付中

    java 標準クラス

    java勉強中ですがうまく動作しません。 ------dokojavaで動作しましたが、3回づつ表示されます。 public class Main { public st

  • 解決済

    入力した値を表示させない方法

    初めまして。現在JAVAを学んでいる初心者です。 現在、配列に格納している値を表示させるプログラムを作っています。 ユーザーから入力があった場合、次に配列の値を表示させるとき、

  • 解決済

    java replaceでcharが文字化けする

    前提・実現したいこと int型の数値をchar型にキャストし、それを二番目の引数にしてreplaceをした文字列が文字化けしてしまう問題が発生しました。 該当のソースコード

  • 解決済

    Javaの日付に関するプログラムについて質問です。

    いつもお世話になっています。こんばんは。 このような表示結果のプログラムを作りたいのですがコンパイルは通るのですが、実行ができません。なぜでしょうか?まだJava初心者なのでみな

  • 解決済

    javaの2重ループ

    前提・実現したいこと javaで1~15まで1づつカウントアップした数字を並べ、 実行する時のargs[0]の値で改行したい。 それを2重ループで書きたい。 args[

  • 解決済

    Java初心者・ 配列について

    質問 4 5    //行の数と列の数 2 5 2 43 34 34 4 43 24 19 4 9 -3 4 4 12 43 34 -35 43 上記のような表が入力されたとし

  • 解決済

    Java8 にてパスワード付きのWindows共有フォルダにアクセスする方法

    Java8 を使用しています。 ファイルコピーを パスワード付きのWindows共有フォルダにアクセスする方法 が知りたいです。 Windows フォルダのファイル <->

同じタグがついた質問を見る

  • Java

    13788questions

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

  • 配列

    522questions

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

  • ファイル

    170questions

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

  • ファイルI/O

    38questions

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