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

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

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

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

Q&A

解決済

6回答

1930閲覧

ブラックジャックのエラー解決について

mnodudy.12

総合スコア4

Java

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

0グッド

1クリップ

投稿2021/07/05 09:48

編集2021/07/05 10:41

前提・実現したいこと

ブラックジャックの作成途中でエラーが出てしまい解決したいです!
以下のエラー文が出力されました。

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

エラーメッセージブラックジャックをこれから始めます!! カードを配りますね Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2 at java.util.ArrayList.rangeCheck(ArrayList.java:657) at java.util.ArrayList.get(ArrayList.java:433) at Campkadai.Dealer.open(Dealer.java:38) at Campkadai.Dealer.checkSum(Dealer.java:55) at Campkadai.Blackjack.main(Blackjack.java:16)

該当のソースコード

User.Java import java.util.ArrayList; public class User extends Human { protected ArrayList<Integer> cards = new ArrayList<Integer>(); public void setCards(ArrayList<Integer> drawCard) { for(int i= 0;i<drawCard.size();i++){ myCards.add(drawCard.get(i)); } } public int open() { int total = 0; for(int i =0; i<=myCards.size(); i++) { if(10 <= myCards.get(i)) { total += 10; }else { total += myCards.get(i); } } return total; } public boolean checkSum() { if (open() < 17) { return true; }else{ return false; } } }
Human.Java import java.util.ArrayList; public abstract class Human { protected ArrayList<Integer> myCards = new ArrayList<Integer>(); abstract public int open(); abstract public void setCards(ArrayList <Integer> drawCard); abstract public boolean checkSum(); }
Dealer.Java import java.util.ArrayList; import java.util.Collections; public class Dealer extends Human { protected ArrayList <Integer> cards = new ArrayList<Integer>(); public Dealer() { for(int n=1; n<=4; n++) { for(int i=1; i<=13; i++) { cards.add(i); } } Collections.shuffle(cards); } public ArrayList<Integer> deal(){ ArrayList<Integer> setCards = new ArrayList<Integer>(); setCards.add(cards.get(0)); setCards.add(cards.get(1)); cards.remove(0); cards.remove(0); return setCards; } public void setCards(ArrayList<Integer> drawCard) { for(int i= 0; i<drawCard.size(); i++){ myCards.add(drawCard.get(i)); } } public int open() { int total = 0; for(int i=0; i<=myCards.size(); i++) { if(0<= myCards.get(i)) { total += 10; }else { total += myCards.get(i); } } return total; } public ArrayList<Integer> hit(){ ArrayList<Integer>setCards = new ArrayList<Integer>(); setCards.add(cards.get(0)); cards.remove(0); return cards; } public boolean checkSum() { if (open() < 17 ) { return true; }else{ return false; } } }
BlackJack.Java public class Blackjack { public static void main(String[]args) { Dealer dealer = new Dealer(); User user = new User(); System.out.println("ブラックジャックをこれから始めます!!"); System.out.println("カードを配りますね"); dealer.setCards(dealer.deal()); user.setCards(dealer.deal()); dealer.checkSum(); while (dealer.checkSum() == true) { dealer.hit(); dealer.setCards(dealer.myCards); break; } System.out.println("ディーラーの手札はこちらです‼!"); while (user.checkSum() == true) { dealer.hit(); dealer.setCards(dealer.myCards); break; } System.out.println("あなたの手札はこちらです‼"); user.checkSum(); System.out.println("ディーラーは"+ dealer.myCards); System.out.println(dealer.open()); System.out.println("あなたは"+ user.myCards); System.out.println(user.open()); if(user.open() == 21) { System.out.println("ブラックジャック!あなたの勝ち"); }else if(user.open() < 21 && dealer.open()<user.open() || dealer.open()>21){ System.out.println("あなたの勝ち"); }else if(user.open() > 21){ System.out.println("バースト!あなたの負け"); }else if(dealer.open() ==21 || dealer.open() <=21 && user.open()<dealer.open()){ System.out.println("あなたの負け"); }else if(user.open() == dealer.open() || user.open()>21 && dealer.open()>21){ System.out.println("引き分け"); } } }

試したこと

エラーコードから配列内の数字を変更しましたが解決しませんでした。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

y_waiwai

2021/07/05 10:08

コードはテキストで提示しましょう 質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
BeatStar

2021/07/05 10:10

画像での質問はやめましょう。 識別できないし、仮にできても 『再現率が低くなる』です。 たとえば、『半角スペースにすべきところを全角スペースにしている』とか。 反転させてやっとわかることを『プロだからわかるだろ』とか暴論。 それと、『エラーメッセージぐらいは読みましょう』。 エラーメッセージは怒声でも罵倒でも罵声でもハラスメントでもなく、 『コンパイラ等からメッセージ』です。 つまり、今の状態は『相手の話を聞かずに逆ギレしている人』です。 そういう人はコミュニケーションなんて取れませんよね。
mnodudy.12

2021/07/05 10:47

お答えいただきありがとうございます。 こちらを使うのに慣れていませんでしたので修正させていただきました。 エラーメッセージ自体も調べたのですが、配列、リストの範囲をこえているというのは理解できました。 また、個人的なのですが初学者ということもあり経験豊富な皆様の意見を頂きたかったです。
BeatStar

2021/07/05 10:53

今ケータイからなので確かめられないので、 blackjack.javaの16行目はどこになっていますか?
mnodudy.12

2021/07/05 12:03

ご返信ありがとうございます。 16行目は dealer.checkSum(); になっております。
guest

回答6

0

コードは読んでませんが(読めませんが)

IndexOutOfBoundsExceptionってのは、配列、リストの範囲を超えてアクセスしたときにでます
こいつが出た行で範囲を超えてないかチェックしてみよう

投稿2021/07/05 10:09

y_waiwai

総合スコア88042

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

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

mnodudy.12

2021/07/05 10:49

コメントありがとうございます。 エラーの意味は調べたのですが具体的にどのようにすれば解決するのかわからなくなってしまい質問させていただきました。
guest

0

エラーを解決するにはエラーメッセージを見て原因のコードを変更するといいですよ!

投稿2021/07/05 10:08

jamjam3

総合スコア165

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

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

mnodudy.12

2021/07/05 10:50

コメントありがとうございます。
guest

0

ベストアンサー

for(int i=0; i<=myCards.size(); i++) {

これを次のように変えてみてください。

Java

1 for(int i=0; i<myCards.size(); i++) {

myCards.size() は myCards の要素数を返します。
myCars.get(i) の i は 0 から要素数 - 1 の間になければいけません。
i<=myCards.size() では i が myCards.size() に等しくなることがあるので、その時範囲外になります。

投稿2021/07/05 12:59

Zuishin

総合スコア28669

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

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

mnodudy.12

2021/07/05 13:41

ありがとうございます! 無事エラーからは解放されました。 =の有無だけで良かったんですね、、 だいぶ悩まされたので本当にありがとうございます!
guest

0

エラーが発生してるのはココかな。

Java

1public class Dealer extends Human { 2 public int open() { 3 for(int i=0; i<=myCards.size(); i++) {

エラー文にあるけど、リストに何個入っているか、for文が何回ループしてるかデバッグして確認するとわかるんじゃないかな。

投稿2021/07/05 11:23

javahack

総合スコア1088

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

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

mnodudy.12

2021/07/05 12:43

openメソッドが怪しいのでそうかもしれないです、、
javahack

2021/07/05 12:47

怪しい箇所がわかっているならデバッグして確認しましょう。
guest

0

皆様ありがとうございました!

こんなにも温かい人達に教えていただけて嬉しいです!

for(int i=0; i<=myCards.size(); i++) {

for(int i=0; i<myCards.size(); i++) {
でエラー解決しました。

投稿2021/07/05 13:55

mnodudy.12

総合スコア4

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

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

0

エラーメッセージ(今回は『例外』)を読んでみてください。

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2 [訳] mainスレッドにて例外発生。 java.lang.IndexOutOfBoundsException です。 サイズが2なのに要素番号2にアクセスしちゃってるよ? at java.util.ArrayList.rangeCheck(ArrayList.java:657) at java.util.ArrayList.get(ArrayList.java:433) at Campkadai.Dealer.open(Dealer.java:38) at Campkadai.Dealer.checkSum(Dealer.java:55) at Campkadai.Blackjack.main(Blackjack.java:16) [訳] 場所はBlackjackクラスのmainメソッド (Blackjack.javaの16行目) で使われている、 Dealer.checkSumメソッドで使われている、 Dealer.openメソッドで使われている、 ...だよ〜

と言う例外とスタックトレースを追っていくと、

Dealer.open内が怪しいですね。

ちなみに
java.lang.IndexOutOfBoundsException

Index(要素番号) Out Of(〜の外) Bounds(境界,アクセス可能範囲) Exception(例外)

つまり、アクセスできる範囲を超えた範囲にアクセスしている事が原因の例外です。

例えば要素数10の配列を arr[50] とかみたいにありえない範囲にアクセスしているとかです。

ここまであからさまでは無いにしても、配列やリスト等は0番目から(n-1)番目までしかアクセスできません。
要素数の−1です。

その範囲を超えたら例外が飛んできます。

怪しいと思うopenメソッドの中の処理を追ってみてください。

コードを読むコツは『一行レベルで、なにをしているか考えながら読む』です。

例えばコメントにするとか。

それを現実世界でシミュレーションしてみてください。

具体的な値を設定したりして。

そうすればわかるはずです。

投稿2021/07/05 13:48

BeatStar

総合スコア4962

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

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

mnodudy.12

2021/07/05 13:53

とてもわかりやすいコメントありがとうございます! ここまで親身に相談に乗っていただき感動しました。 BeatStarさんにプログラミング教わることが出来たらものすごいスピードで向上すると思います! 先程質問は解決しましたが、また分からないことが有れば自分でエラーコードを丁寧に読んでそれでもわからなければ相談させていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問