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

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

新規登録して質問してみよう
ただいま回答率
86.12%
Java

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

解決済

java.lang.IndexOutOfBoundsExceptionの解決方法

inori333
inori333

総合スコア2

Java

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

1回答

0リアクション

1クリップ

513閲覧

投稿2022/09/14 08:41

編集2022/09/14 11:39

前提

ここに質問の内容を詳しく書いてください。
arraylistに入っている車を検索するシステムを作っているときにエラーが発生し、そのエラーの解決方法がわからないので教えてほしいです。

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • carsearch_0でそれぞれのif文を正しく実行しエラーで強制終了しないようにしたい

発生している問題・エラーメッセージ

車種名を入力してください クラウン 名前:クラウン,値段:4350000円 オプション一覧 キーレス,スマートキー,パワーウィンドウ,ベンチシート,シートヒーター,シートクーラー,本革シート,Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 8 out of bounds for length 0 at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) at java.base/java.util.Objects.checkIndex(Objects.java:372) at java.base/java.util.ArrayList.get(ArrayList.java:459) at Car_register.carsearch_0(Car_register.java:127) at CarOption.search_0(CarOption.java:50) at Main.main(Main.java:21)

該当のソースコード

import java.io.IOException; import java.util.ArrayList; import java.nio.file.Files; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Scanner; public class CarOption extends Car_register{ private String[] status = new String[27]; private String fail; static String name; Scanner sc = new Scanner(System.in); CarOption(String name) { this.fail = name; } //車の登録 public void registration() { Path inputFilePath = Paths.get(this.fail); try { ArrayList<String> lines = (ArrayList<String>) Files.readAllLines(inputFilePath, StandardCharsets.UTF_8); for (String line : lines) { this.status = line.split(","); for (int i = 0; i < status.length; i++) { if (i == 11) { System.out.println(status[i]); } else { System.out.printf("%s,", status[i]); } } register(status); } System.out.println(""); } catch (IOException e) { System.out.println("読み込みに失敗しました"); System.out.println("プログラムを終了します"); System.out.println(e); System.exit(0); } } public void search_0(){ System.out.println("車種名を入力してください"); name = sc.nextLine(); Car_register.carsearch_0(this.name); } public void search_1(){ System.out.println("上限金額を入力してください"); int price_max = Integer.parseInt(sc.nextLine()); System.out.println("下限金額を入力してください"); int price_min = Integer.parseInt(sc.nextLine()); // Car_register.migration(); Car_register.carsearch_1(price_max, price_min); } public void search_2(){ // Car_register.migration(); } } import java.util.ArrayList; public class Car_register { //車のオプション static ArrayList<String> name = new ArrayList<String>(); static ArrayList<Integer> price = new ArrayList<Integer>(); static ArrayList<Integer> key = new ArrayList<Integer>(); static ArrayList<Integer> smart = new ArrayList<Integer>(); static ArrayList<Integer> power = new ArrayList<Integer>(); static ArrayList<Integer> sheet = new ArrayList<Integer>(); static ArrayList<Integer> heater = new ArrayList<Integer>(); static ArrayList<Integer> cooler = new ArrayList<Integer>(); static ArrayList<Integer> leather = new ArrayList<Integer>(); static ArrayList<Integer> ottoman = new ArrayList<Integer>(); static ArrayList<Integer> three = new ArrayList<Integer>(); static ArrayList<Integer> monitor = new ArrayList<Integer>(); static String car_data[] = new String[27]; static int car_price[] = new int[27]; static int car_key[] = new int[27]; static int car_smart[] = new int[27]; static int car_sheet[] = new int[27]; static int car_power[] = new int[27]; static int car_heater[] = new int[27]; static int car_cooler[] = new int[27]; static int car_leather[] = new int[27]; static int car_ottoman[] = new int[27]; static int car_monitor[] = new int[27]; static int car_three[] = new int[27]; static int cnt = 0; static int cnt2 = 0; public void register(String status[]) { for (int i = 0; i < 11; i++) { if (i == 0) { this.name.add(status[i]); } else if (i == 1) { this.price.add(Integer.parseInt(status[i])); } else if (i == 2) { this.key.add(Integer.parseInt(status[i])); } else if (i == 3) { this.smart.add(Integer.parseInt(status[i])); } else if (i == 4) { this.power.add(Integer.parseInt(status[i])); } else if (i == 5) { this.sheet.add(Integer.parseInt(status[i])); } else if (i == 6) { this.heater.add(Integer.parseInt(status[i])); } else if (i == 7) { this.cooler.add(Integer.parseInt(status[i])); } else if (i == 8) { this.leather.add(Integer.parseInt(status[i])); } else if (i == 9) { this.ottoman.add(Integer.parseInt(status[i])); } else if (i == 10) { this.three.add(Integer.parseInt(status[i])); } else if (i == 11) { this.monitor.add(Integer.parseInt(status[i])); } } } public void display() { System.out.println("車一覧"); for (int i = 0; i < 27; i++) { System.out.println(name.get(i)); } } static void carsearch_0(String car_name){ for(int i = 0; i < name.size(); i++){ if(car_name.equals(name.get(i)) && name.size() > i){ System.out.println("名前:" + name.get(i) + "," + "値段:" + price.get(i) + "円"); cnt2++; System.out.println("オプション一覧"); if(key.get(i) == 1){ System.out.printf("キーレス,"); cnt++; } if(smart.get(i) == 1){ System.out.printf("スマートキー,"); cnt++; } if(power.get(i) == 1){ System.out.printf("パワーウィンドウ,"); cnt++; } if(sheet.get(i) == 1){ System.out.printf("ベンチシート,"); cnt++; } if(heater.get(i) == 1){ System.out.printf("シートヒーター,"); cnt++; } if(cooler.get(i) == 1){ System.out.printf("シートクーラー,"); cnt++; } if(leather.get(i) == 1){ System.out.printf("本革シート,"); cnt++; } if(three.get(i) == 1){ System.out.printf("3列シート,"); cnt++; } if(monitor.get(i) == 1){ System.out.println("後席モニター"); cnt++; } if(cnt == 0){ System.out.println("オプションはありません"); } cnt = 0; }else{ if(i == 26 && cnt2 == 0){ System.out.println("該当する車種は存在しません"); cnt2 = 0; } } } } } import java.util.Scanner; public class Main { public static void main(String[] args){ CarOption car = new CarOption(args[0]); car.registration(); Scanner sc = new Scanner(System.in); System.out.println("/MENU/"); System.out.println("「0」車一覧「1」検索「2」終了 "); int a = Integer.parseInt(sc.next()); while (true) { if (a == 0) { car.display(); } else if (a == 1) { System.out.println("検索の仕方を選択してください"); System.out.println("「0」車種名「1」値段「2」オプション"); int b = Integer.parseInt(sc.next()); if(b == 0){ car.search_0(); }else if(b == 1){ car.search_1(); }else if(b == 2){ car.search_2(); } } else if (a == 2) { System.out.println("ありがとうございました"); break; } System.out.println("/MENU/"); System.out.println("「0」車一覧「1」検索「2」終了 "); a = Integer.parseInt(sc.next()); } sc.close(); } } アルファード,3597000,1,1,1,0,1,0,0,1,1,1 ハイエース,2903600,1,1,1,0,0,0,0,0,1,0 プリウス,2597000,1,1,1,0,1,0,1,0,0,0 ハリアー,2990000,1,1,1,1,1,0,0,0,0,0 ランドクルーザー,5100000,1,1,1,1,1,0,1,0,1,0 アクア,1980000,1,1,1,0,0,0,0,0,0,0 ヴォクシー,3090000,1,1,1,0,1,0,0,0,1,0 ヴェルファイア,4306000,1,1,1,0,0,0,0,1,1,1 クラウン,4350000,1,1,1,1,1,1,1,0,0,0 GR86,2799000,1,1,1,0,1,0,0,0,0,0 ノア,2670000,1,1,1,0,0,0,0,0,1,0 シエンタ,1818500,1,1,1,0,0,0,0,0,1,0 ハイラックス,4312000,1,1,1,0,0,0,0,0,0,0 RAV4,2774000,1,1,1,0,0,0,0,0,0,0 ヤリスクロス,1896000,1,1,1,0,0,0,0,0,0,0 ライズ,1707000,1,1,1,0,1,0,0,0,0,0 ルーミー,1556500,1,1,1,0,1,0,0,0,0,0 カローラスポーツ,2169000,1,1,1,0,0,0,0,0,0,0 パッソ,1265000,1,0,1,0,1,0,0,0,0,0 カムリ,3495000,1,1,1,1,0,0,0,0,0,0 カローラフィールダー,1709400,1,1,1,0,0,0,0,0,0,0 カローラクロス,1999000,1,0,1,0,0,0,0,0,0,0 カローラツーリング,2013000,1,1,1,0,1,0,0,0,0,0 スープラ,4995000,1,1,1,1,1,0,0,0,0,0 C-HR,2792000,1,1,1,0,1,0,0,0,0,0 MIRAI,7100000,1,1,1,1,1,1,1,0,0,0 コペン,2382200,1,1,1,0,1,0,0,0,0,0

試したこと

まず、CarOptionクラスのsearch_0で車種名を入力し、それを引数にしCar_registerクラスのcarsearch_0を実行した際に上に載せたようなエラーが出てしまいました。

補足情報(FW/ツールのバージョンなど)

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

2022/09/14 14:53

こちらの質問が複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

swordone

2022/09/14 10:14

「Car_registerクラスの127行目」はどれですか?
jimbe

2022/09/14 10:41 編集

IndexOutOfBoundsException が何なのかは分かっておられるのでしょうか。 > ソースコードの欄で「------」で区切っています マークダウンで分けてください。 そのようにされるとこちらでテストする際に編集する必要があり、間違いが入り込む可能性がある等の余計な心配・手間がかかります。 …と思ったら、Main.java が無いので実行自体出来ないです。 車のデータファイルも必要ですね。
BeatStar

2022/09/14 11:41

> java.lang.IndexOutOfBoundsExceptionの解決方法 ■ 例外メッセージを読む ■ デバッグをする しかないかと。
inori333

2022/09/14 11:47

BeatStarさん回答ありがとうございます。長さが0のArraylistを参照しているから今回のエラーが起きているのはわかるんですが、今回用意したデータはちゃんとArraylistに入っているのでなぜ長さが0のところを参照しているのかがわからず、解決方法もわからない感じです。
jimbe

2022/09/14 12:29 編集

> 今回用意したデータはちゃんとArraylistに入っているので 入っていない所があります。 入れている個所に print を仕込む等してみてください。 表示されない=通っていない=入っていない個所が見つかるはずです。 例外は if(monitor.get(i) == 1){ System.out.println("後席モニター"); cnt++; } の if 文で発生しています。
jimbe

2022/09/14 12:31

コードは ``` の行で挟むことで枠内にコードが入るようになります。 個々のソースコードやファイルを個々に ``` で挟むようにして頂ければ、それぞれ毎にコピー出来るようになります。
inori333

2022/09/14 12:37

jimbeさん、回答ありがとうございます。後席モニターの部分で例外が出ていることがわかったおかげで解決することが出来ました。 Car_registerクラスの35行目のfor文で繰り返す回数が1回少なく後席モニターのデータが入っていませんでした。
kazuma-s

2022/09/14 13:42

for文を使う必要はありません。次のように書くべきです。 public void register(String status[]) {   this.name.add(status[0]);   this.price.add(Integer.parseInt(status[1]));   this.key.add(Integer.parseInt(status[2]));   ...   this.monitor.add(Integer.parseInt(status[11])); }
jimbe

2022/09/14 16:44

どこで例外が発生したかは、例外のメッセージ内にスタックトレースとして表示されています。(swordone さんが真っ先に指摘されています。) 場所さえ分かればということですので、是非スタックトレースもチェックするようにしてください。
swordone

2022/09/14 17:21

まずこれこんな頭がおかしくなりそうなコードやめてCarクラスみたいなのを作りたい

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Java

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

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。