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

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

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

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

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

Q&A

解決済

1回答

679閲覧

値渡しがうまくいきません。どなたかご教授ください

soshin

総合スコア11

Java

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

例外

例外(exception)とは、プログラムの処理実行中に発生する、通常の処理の続行を妨げる特殊な事象のことを呼びます。この「例外」が発生した場合に、現在の処理を中断し、変わりに別の処理を実行させる事を「例外処理」と呼びます。

0グッド

0クリップ

投稿2020/04/30 08:21

編集2020/04/30 11:39

前提・実現したいこと

ポケモンのシステム内で行われる個体値パズルというものを行うプログラムを作っています。

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

定義したはずのH A B C D Sという変数をmainメソッドからrecalcメソッドに渡したいのですが、
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.base/java.util.LinkedList.checkElementIndex(LinkedList.java:559)
at java.base/java.util.LinkedList.get(LinkedList.java:480)
at IVpazzle.recalc(IVpazzle.java:93)
at IVpazzle.main(IVpazzle.java:33)
というエラーメッセージが出てしまいました。

該当のソースコード

Java

1import java.util.*; 2 3public class IVpazzle{ 4 public static void main(String[] args) { 5 System.out.printf(" IVsupporter ver%1.1f%n ", 1.0); 6 System.out.println("注:自然Vが発生している個体値はサポートされていません"); 7 System.out.println(); 8 System.out.println("ポケモンのV固定数を入力してください"); 9 int Vnum = new Scanner(System.in).nextInt(); 10 if (Vnum < 0 || Vnum > 5){ 11 System.out.println("値が不正です"); 12 System.exit(0); 13 } 14 System.out.println(" ポケモンの個体値を入力してください(例:x x x x x x)"); 15 String IV = new Scanner(System.in).nextLine(); 16 String Array[] = IV.split(" "); 17 int H = Integer.parseInt(Array[0]); 18 int A = Integer.parseInt(Array[1]); 19 int B = Integer.parseInt(Array[2]); 20 int C = Integer.parseInt(Array[3]); 21 int D = Integer.parseInt(Array[4]); 22 int S = Integer.parseInt(Array[5]); 23 if (H < 0 || H > 31 || A < 0 || A > 31 || B < 0 || B > 31 || C < 0 || C > 31 || D < 0 || D > 31 || S < 0 || S > 31){ 24 System.out.println("値が不正です"); 25 System.exit(0); 26} 27 else if (!(H == 31) && (H % 8 == 0)){ 28 H = 31; 29 int[] IVf = recalc(H, A, B, C, D, S); 30 } 31 else if (!(H == 31) && (H % 8 == 1) && !(A == 31)){ 32 A = 31; 33 int[] IVf = recalc(H, A, B, C, D, S); 34 } 35 else if (!(H == 31) && (H % 8 == 2) && !(B == 31)){ 36 B = 31; 37 int[] IVf = recalc(H, A, B, C, D, S); 38 } 39 else if (!(H == 31) && (H % 8 == 3) && !(C == 31)){ 40 C = 31; 41 int[] IVf = recalc(H, A, B, C, D, S); 42 } 43 else if (!(H == 31) && (H % 8 == 4) && !(D == 31)){ 44 D = 31; 45 int[] IVf = recalc(H, A, B, C, D, S); 46 } 47 else if (!(H == 31) && (H % 8 == 5) && !(S == 31)){ 48 S = 31; 49 int[] IVf = recalc(H, A, B, C, D, S); 50 } 51 52 else if (!(H == 31) && (H % 8 == 1) && (A == 31) ){ 53 int[] IVf = recalc(H, A, B, C, D, S); 54} 55 else if (!(H == 31) && (H % 8 == 2) && (B == 31)){ 56 int[] IVf = recalc(H, A, B, C, D, S); 57} 58 else if (!(H == 31) && (H % 8 == 3) && (C == 31)){ 59 int[] IVf = recalc(H, A, B, C, D, S); 60} 61 else if (!(H == 31) && (H % 8 == 4) && (D == 31)){ 62 int[] IVf = recalc(H, A, B, C, D, S); 63} 64 else if (!(H == 31) && (H % 8 == 5) && (S == 31)){ 65 int[] IVf = recalc(H, A, B, C, D, S); 66} 67 } 68 69 public static int[] recalc(int H, int A, int B, int C, int D, int S){ 70 LinkedList<Integer> num = new LinkedList<Integer>(); 71 if (!(H == 31)) 72 num.add(H); 73 else if (!(A == 31)) 74 num.add(A); 75 else if (!(B == 31)) 76 num.add(B); 77 else if (!(C == 31)) 78 num.add(C); 79 else if (!(D == 31)) 80 num.add(D); 81 else if (!(S == 31)) 82 num.add(S); 83 num.remove(0); 84 int[] IV = new int[6]; 85 IV[0] = H; 86 IV[1] = A; 87 IV[2] = B; 88 IV[3] = C; 89 IV[4] = D; 90 IV[5] = S; 91 for (int r = 0; r <= num.size(); r++){ 92 if ( !(IV[0] == 31)){ 93 IV[0] = num.get(0); 94 } 95 else if ((IV[0] == 31) && !(IV[1] == 31)){ 96 IV[1] = num.get(0); 97 } 98 else if ((IV[0] == 31) && (IV[1] == 31) && !(IV[2] == 31)){ 99 IV[2] = num.get(0); 100 } 101 else if ((IV[0] == 31) && (IV[1] == 31) && (IV[2] == 31) && !(IV[3] == 31)){ 102 IV[3] = num.get(0); 103 } 104 else if ((IV[0] == 31) && (IV[1] == 31) && (IV[2] == 31) && (IV[3] == 31) && !(IV[4] == 31)){ 105 IV[4] = num.get(0); 106 } 107 else if ((IV[0] == 31) && (IV[1] == 31) && (IV[2] == 31) && (IV[3] == 31) && (IV[4] == 31) && !(IV[5] == 31)){ 108 IV[5] = num.get(0); 109 } 110 num.remove(0); 111 } 112 System.out.print(IV[0] + " "); 113 System.out.print(IV[1] + " "); 114 System.out.print(IV[2] + " "); 115 System.out.print(IV[3] + " "); 116 System.out.print(IV[4] + " "); 117 System.out.print(IV[5] + " "); 118 return IV; 119 } 120}

試したこと

System.out.printlnで値がH A B C D Sに代入されているか確認しました。
調べたところ、OutOfBoundsExceptionは値が入っていなかったり宣言していない変数を使おうとすると出るエラーのようだったので、全体を何度か見直しましたが、表記ミスを見つけることはできませんでした。

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

開発環境はmacです。IDEはAtomで、JDKは最新のものを使っています。

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

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

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

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

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

Yasumichi

2020/04/30 08:54

ソースが崩れてるので markdown 記法に誤りがないか、確認して修正すると良いと思います。
guest

回答1

0

ベストアンサー

Atom はデバック機能とかついてないのでしょうか?

74行目の

java

1 num.remove(0);

を実行した時点で num の要素数が 0 になってしまいます。そのため、以降の

java

1 IV[0] = num.get(0);

の処理で java.lang.IndexOutOfBoundsException が発生しています。

 業務ロジックが分からないのでこれ以上は、お答えしかねますが、参考になりますでしょうか?

【追記】

java

1 public static int[] recalc(int H, int A, int B, int C, int D, int S) { 2 LinkedList<Integer> num = new LinkedList<Integer>(); 3 if (!(H == 31)) 4 num.add(H); 5 else if (!(A == 31)) 6 num.add(A); 7 else if (!(B == 31)) 8 num.add(B); 9 else if (!(C == 31)) 10 num.add(C); 11 else if (!(D == 31)) 12 num.add(D); 13 else if (!(S == 31)) 14 num.add(S);

ここの if 文って、どれか一個のブロックが実行されるだけで必ず num の要素が1個になります。

多分、else でつなげず、以下のそれぞれ独立した if にした方が良いのでは?

java

1 LinkedList<Integer> num = new LinkedList<Integer>(); 2 if (!(H == 31)) 3 num.add(H); 4 if (!(A == 31)) 5 num.add(A); 6 if (!(B == 31)) 7 num.add(B); 8 if (!(C == 31)) 9 num.add(C); 10 if (!(D == 31)) 11 num.add(D); 12 if (!(S == 31)) 13 num.add(S); 14 num.remove(0);

目的が達成できるかは、別の話ですが。

投稿2020/04/30 08:53

編集2020/04/30 09:56
Yasumichi

総合スコア1773

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

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

soshin

2020/04/30 09:47

自分が考えていたのは、 LinkedListのnumの0番目の要素が削除される→1個づつ詰められて、1番目にあった要素が0番目になる→IV[0]に代入する という感じなのですが、このような操作は不可能なのでしょうか...? 初心者のため拙い文章で申し訳ないです。
退会済みユーザー

退会済みユーザー

2020/04/30 09:57

空のリストつくって要素追加(一個しか追加されません)し追加した要素を削除ですよ。 Ifの勉強してください
Yasumichi

2020/04/30 09:59

コメントだとコードブロックが見づらいので元の回答に追記した部分を読んでください。 あと、余裕ができたら、質問本文のコードブロックも見やすくしてください。 多分、「```」の使い方がおかしいのかと。
soshin

2020/04/30 11:32

追記の内容にしたら、うまくいきました! else ifだと最初のifがtrueだった時点で値が代入されることないですもんね... asahinaさんも助言ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問