🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

配列

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

Q&A

解決済

1回答

1258閲覧

stackとqueueの実行エラーについて

shimajiro1917

総合スコア4

Java

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

配列

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

0グッド

0クリップ

投稿2021/01/07 07:22

編集2021/01/07 08:22

#いくつかの図形の面積を表すサブクラスで別のクラスにインスタンスを使ってstackの順とqueueの順で実行したいです

#理想のコンソールの例
The contents of figures1 are as follows:
I am a rectangle with area200.0.
I am a rectangle with area600.0.
I am a Circle1 with area1256.6370614359173.
I am a Circle1 with area2827.4333882308138.
I am a Triangle with area0.0.
I am a Triangle with area0.0.
I am a Triangle with area0.0.
I am a Square with area0.0.
I am a Square with area900.0.

The contents of MyQueue are as follows:
I am a rectangle with area200.0.
I am a rectangle with area600.0.
I am a Circle1 with area1256.6370614359173.
I am a Circle1 with area2827.4333882308138.
I am a Triangle with area0.0.
I am a Triangle with area0.0.
I am a Triangle with area0.0.

The contents of MyStack are as follows:
I am a Square with area900.0.
I am a Square with area0.0.
I am a Triangle with area0.0.
I am a Triangle with area0.0.
I am a Triangle with area0.0.
I am a Circle1 with area2827.4333882308138.
I am a Circle1 with area1256.6370614359173.
I am a rectangle with area600.0.
I am a rectangle with area200.0.

#実際に実行すると
The contents of figures1 are as follows:
I am a rectangle with area200.0.
I am a rectangle with area600.0.
I am a Circle1 with area1256.6370614359173.
I am a Circle1 with area2827.4333882308138.
I am a Triangle with area0.0.
I am a Triangle with area0.0.
I am a Triangle with area0.0.
I am a Square with area0.0.
I am a Square with area900.0.

The contents of MyQueue are as follows:
I am a rectangle with area200.0.
I am a rectangle with area600.0.
I am a Circle1 with area1256.6370614359173.
I am a Circle1 with area2827.4333882308138.
I am a Triangle with area0.0.
I am a Triangle with area0.0.
I am a Triangle with area0.0.

The contents of MyStack are as follows:
I am a Square with area900.0.
I am a Square with area0.0.
**Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8
at object.MyStack.pop(MyStack.java:35)
at object.FiguresQS.main(FiguresQS.java:64)
**

のようになり、stackのコードが実行されません。

#考えられる問題
コンソールに表示してあるようにクラスMyStackの35行目とFiguresQSの64行目に何かしらの問題が生じているようです。

#該当するソースコード

Java

1package object; 2 3public class FiguresQS { 4 5 public static void main(String[] args) { 6 Figure[] figures1 = new Figure[9]; 7 8 int i = 0; 9 Rectangle r1 = new Rectangle(); 10 Rectangle r2 = new Rectangle(30, 20); 11 figures1[i++] = r1; 12 figures1[i++] = r2; 13 14 Circle1 c1 = new Circle1(); 15 Circle1 c2 = new Circle1(30); 16 figures1[i++] = c1; 17 figures1[i++] = c2; 18 19 Triangle t1 = new Triangle(); 20 Triangle t2 = new Triangle(30, 20); 21 Triangle t3 = new Triangle(300, 200); 22 figures1[i++] = t1; 23 figures1[i++] = t2; 24 figures1[i++] = t3; 25 26 Square1 s1 = new Square1(); 27 Square1 s2 = new Square1(20); 28 figures1[i++] = s1; 29 figures1[i++] = s2; 30 31 System.out.println("The contents of figures1 are as follows:"); 32 for (int j=0; j<figures1.length; j++) { 33 figures1[j].identify(); 34 } 35 36 System.out.println(); 37 MyQueue queue = new MyQueue(7); 38 int k = 0; 39 try{ 40 while(queue.isFull() == false) { 41 queue.put(figures1[k]); 42 k++; 43 } 44 } catch (ArrayIndexOutOfBoundsException e) { 45 } 46 System.out.println("The contents of MyQueue are as follows:"); 47 for(int j = 0;j<7; j++){ 48 queue.get().identify(); 49 } 50 ///Stackの実装 51 System.out.println(); 52 MyStack stack = new MyStack(8); 53 try { 54 while(stack.isFull() == false) { 55 stack.push(figures1[k]); 56 k++; 57 } 58 } catch (ArrayIndexOutOfBoundsException e) { 59 } 60 ///printnできるコードの数が限られているように思える 61 System.out.println("The contents of MyStack are as follows:"); 62 for(int j=0; j<8; j++) { 63 ///下コードに問題がある///配列の長さに原因があると思われる 64 stack.pop().identify(); 65 } 66 } 67} 68

#問題があると思われるMyStackクラス

Java

1package object; 2 3public class MyStack { 4 private Figure[] Buff; 5 private int sp; 6 private int count; 7 Figure x; 8 public MyStack(int size) { 9 Buff = new Figure[size]; 10 sp = 0; 11 count = 0; 12 } 13 public boolean isEmpty() { 14 if(count==0) { 15 return true; 16 }else { 17 return false; 18 } 19 } 20 public boolean isFull() { 21 if(count >= Buff.length) { 22 return true; 23 }else { 24 return false; 25 } 26 } 27 public void push(Figure x) { 28 Buff[sp] = x; 29 sp++; 30 count++; 31 } 32 public Figure pop() { 33 sp--; 34 ///このコードに問題がある 35 x = Buff[sp]; 36 count--; 37 return(x); 38 } 39} 40 41

#Rectangleのコード

Java

1 package object; 2 3import java.util.concurrent.atomic.AtomicInteger; 4 5public class Rectangle extends Figure { 6 7 private double height = 0; 8 private double width = 0; 9 10///当初インスタンスに名前と番号を付けようと思ったのですがうまく行っていません 11 static final String NAME = Rectangle.class.getSimpleName(); 12 static final java.util.concurrent.atomic.AtomicInteger counter = new AtomicInteger(0); 13 14 15 Rectangle(){ 16 this.width = 20; 17 this.height = 10; 18 } 19 Rectangle(double w, double h){ 20 this.width = w; 21 this.height = h; 22 } 23 void setWidth(double w) { 24 this.width = w; 25 } 26 void setHeight(double h) { 27 this.height = h; 28 } 29 void setSize(double w, double h) { 30 setWidth(w); 31 setHeight(h); 32 } 33 double getWidth() { 34 return this.width; 35 } 36 double getHeight() { 37 return this.height; 38 } 39 40 Rectangle(int width, int height){ 41 super(NAME + counter.addAndGet(1)); 42 this.width = width; 43 this.height = height; 44 } 45 46 @Override 47 double getArea() { 48 return width * height; 49 } 50 void identify() { 51 System.out.println("I am a rectangle with area" + getArea() + "."); 52 } 53 @Override 54 protected void getName() { 55 // TODO 自動生成されたメソッド・スタブ 56 57 } 58} 59

#MiQueueのクラス

Java

1package object; 2 3public class MyQueue { 4 private Figure[]Buff; 5 private int start; 6 private int end; 7 private int count; 8 Figure x; 9 //constructor 10 public MyQueue(int size) { 11 Buff = new Figure[size]; 12 start = 0; 13 count = 0; 14 } 15 //check method 16 public boolean isEmpty() { 17 if (count==0) { 18 return true; 19 }else { 20 return false; 21 } 22 } 23 public boolean isFull() { 24 if(count > Buff.length) { 25 return true; 26 }else { 27 return false; 28 } 29 } 30 //put method 31 public void put(Figure x) { 32 end = start + count; 33 Buff[end] = x; 34 count++; 35 } 36 //get method 37 public Figure get() { 38 x = Buff[start++]; 39 count--; 40 return(x); 41 } 42}

#自分で試したこと
配列の長さに問題があるのかと思い、
MyQueue queue = new MyQueue(7);
の()の中の数値を変えてみたり、同様に
MyStack stack = new MyStack(8); や
Figure[] figures1 = new Figure[9];
も同様に数値を変えてみました。
コンソールMyStackの表示される個数がこれ以上増やすことができず、解決方法がおもいつかなくなりました。
どうすればstackが実行されるのかご存知の方、教えていただけたら幸いです。
また、figures1はFigures1[i++]にいれた図形の情報が全て事項できているのに対し、queueではSquare以降が表示されない理由についてわかる方がいらっしゃいましたら、教えていただけると幸いです。

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

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

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

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

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

kaina

2021/01/07 07:35

人に見て貰うように依頼しているのに、インデントがバラバラの見づらいソースを 提示するのはいかがなものかと、高々合計100ステップちょっとのソースであれば 手動でやっても3分も掛かりませんよ? 別にあなただけではありませんが。 後、try catchでArrayIndexOutOfBoundsExceptionをキャッチしているにも拘らず エラー処理を行っていないのは意図的ですか? まあ、質問内容から分かってないまま書いたのかなあと思いますが。
shimajiro1917

2021/01/07 07:50

みづらいソースになってしまいすみません。ほぼ独学で勉強を始めたばかりなのでみやすいインデントの仕方がわからないもので不快な思いをさせてしまい、申し訳ありません。 try catch、ArrayIndexOutOfBoundsException周辺でエラーが起きていることはわかるのですがどう対処していいのかがわからないため質問させていただきました。
dodox86

2021/01/07 07:52

> 問題があると思われるMyStackクラス 提示されているのはFiguresQS クラスのコードで、MyStackではありません。これでは閲覧者、回答者は判断できません。 また、「理想のコンソールの例」などと提示されていますが、それらの出力内容は質問者さんのRectangleなどの独自クラスのメソッドの実装に依存しています。過去の質問からの続きなのかもしれませんが、それで本質問を見た人たちに判断しろと言うのは少々無理があると思いますがどうでしょうか。
shimajiro1917

2021/01/07 08:01

すみません、MyStackがFiguresQSになっていることに気づきませんでした。修正したのでご確認いただけたら幸いです。
momon-ga

2021/01/07 08:14 編集

根本的にソースが何やってるか理解されていないような気がしますが、 とりあえず動くような回答が欲しいですか?(とりあえずなので、期待した結果にはなるかわからない) ※期待した結果にするには、ソース全部書いてあげないとダメなので面倒・・・ k = 0; を、pushするまえにやれば。
dodox86

2021/01/07 08:13

まず、MyStackについては予約済みの領域(配列)を越えたpush()メソッドの実行についてどうするか、空の領域からのpop()メソッドの実行についてどうするかを決めるのが先決です。それ(仕様)を決めるのはそれを使おうとして作った本人です。MyQueueについてはコードの提示がありませんが、同様のことが言えます。
dodox86

2021/01/07 08:23

尚、「キュー」「スタック」が、一般的にどのようなデータ構造かを理解した上でコーディングされているのが前提です。(そうでないと質問者、回答者間で話が噛み合わなくなります)
kaina

2021/01/07 08:23

別に不快というわけでは無く、回答者が分かるような内容で質問しないと まともな回答を貰える確率が減ってしまうので、今学習しているのであれば 覚えて欲しいと思い指摘しただけです。 インデントについては基本的には「{」に対応した「}」内は半角スペース(2個か4個)またはタブで 字下げをしますが、FiguresQSクラスの43行目以降は正しくインデントされていません。 vscodeやeclipse等の統合開発環境を使用して開発するとショートカット一つで インデントを揃えることが出来るので利用すると良いでしょう。 eclipseの例 https://tech.pjin.jp/blog/2018/09/30/eclipse_auto_indent/ まあ、今回は該当ソースが直接の原因ではありませんが。
shimajiro1917

2021/01/07 09:00

初めて知りました。大変勉強になりました。今後参考にさせていただきます。ご丁寧にご指導いただき本当にありがとうございます。
dodox86

2021/01/07 09:02

私の[2021/01/07 17:13]のコメントより: > MyStackについては予約済みの領域(配列)を越えたpush()メソッドの実行についてどうするか、 についてですが、FiguresQSのmainではpush()の実行に先立ってisFull()であらかじめチェックしているので、私の指摘は少し外れているかもしれませんね。push()に対してpop()の実行が無防備なことがひとつの要因と言えるかもしれません。色々な方法が考えられますが、混乱させてしまうかもしれませんので、以降、コメントおよび回答を控えます。
shimajiro1917

2021/01/07 09:04

stackとqueueはLIFOとFIFOのプログラムという理解です。
shimajiro1917

2021/01/07 09:17

dodox86さん 私の至らない質問に何度もアドバイスをしていただきありがとうございました。必要なコードがどこからどこまでか理解が甘かったことを自覚でき、煮詰まっていた考えが解消しました。アドバイスありがとうございました。
guest

回答1

0

ベストアンサー

*Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8

at object.MyStack.pop(MyStack.java:35)
at object.FiguresQS.main(FiguresQS.java:64)
**

のようになり、stackのコードが実行されません。

考えられる問題

コンソールに表示してあるようにクラスMyStackの35行目とFiguresQSの64行目に何かしらの問題が生じているようです。

スタックトレースで表示される行数は問題が発生した箇所です。
上ほど発生した例外にちかく、それを呼んだ箇所が下に続きます。(要はStack)

つまり、

FiguresQS.java:64で、(mainメソッド)
MyStackのpopメソッドを呼んでいて、
MyStack.java:35行目で

java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8

が発生している。
長さ8の配列に対して、-1のインデックスでアクセスしようとしている

となります。
なので、MyStackのpop周りを修正すればよいですが・・・ソースは間違って添付されてるようですね。

MyStack stack = new MyStack(8); や

Figure[] figures1 = new Figure[9];
も同様に数値を変えてみました。

FiguresQS.javaを、どう修正しても治りません。

ごめんなさい。FigureQSを修正すると、もう少し動きそうです。

The contents of MyStack are as follows:
I am a Square with area900.0.
I am a Square with area0.0.

と、2個まで表示されているということは、2回pushしています。
逆にいうと2回しかpushしていません。
3回目のpushの時点で、ArrayIndexOutOfBoundsExceptionと思います。

インデックスkは、

なので、pushが8回動くように修正してください。


stackのtryの前にk=0;を入れたら動きました泣

なぜ動いたのか、動かなかった操作の何が問題だったのかまだ理解が曖昧

java

1Figure[] figures1 = new Figure[9];

と定義していて、

java

1MyQueue queue = new MyQueue(7); 2 int k = 0; 3 try{ 4 while(queue.isFull() == false) { 5 queue.put(figures1[k]); 6 k++; 7 }

kを0~6まで使っているので、
k = 0;でリセットしない場合、

java

1MyStack stack = new MyStack(8); 2 try { 3 while(stack.isFull() == false) { 4 stack.push(figures1[k]); 5 k++; 6 }

で、stackにpushされるのは、kが、7と8の2回です。
※stack.isFull()はfalseですが、kが9のときに例外が発生します。
直後のcatchに遷移するのですが、処理が書いてないので、気づきにくいです。
※例外を握りつぶすというバッドノウハウなのでやめましょう

java

1} catch (ArrayIndexOutOfBoundsException e) { 2 // e.printStackTrace(); // とりあえずでも、これ書いておけば例外が発生したことは検知できる 3 }

pusuした回数以上にpopを呼んだら例外が発生するのは、そのような実装になっているからです。
それが悪いとは言わないですが、例外の原因を特定できるように自前で制御することが多いと思います。

そもそもint kのスコープが広いというのも推奨されないです。(今回のようなバグを発生させやすいから)
whileの代わりに

java

1for(int k = 0; queue.isFull() == false; k++) { 2 queue.put(figures1[k]); 3}

とすれば、Stackを使うときにkを再利用できないので、0リセットを忘れないようにできます。

投稿2021/01/07 08:00

編集2021/01/07 09:49
momon-ga

総合スコア4826

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

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

shimajiro1917

2021/01/07 08:03

ご回答本当にありがとうございます。 ソースを間違って添付していました。修正しましたのでご確認いただけると幸いです。
momon-ga

2021/01/07 08:49

ごめんなさい。FigureQSを修正すると、もう少し動きそうです。 The contents of MyStack are as follows: I am a Square with area900.0. I am a Square with area0.0. と、2個まで表示されているということは、2回pushしています。 逆にいうと2回しかpushしていません。 3回目のpushの時点で、ArrayIndexOutOfBoundsExceptionと思います。 なので、pushが8回動くように修正してください。
shimajiro1917

2021/01/07 09:07

stackのtryの前にk=0;を入れたら動きました泣 なぜ動いたのか、動かなかった操作の何が問題だったのかまだ理解が曖昧なことだらけなので引き続き勉強を続けようと思います。 何度もありがとうございます。
退会済みユーザー

退会済みユーザー

2021/01/08 02:13

「なぜ動いたのか、動かなかった操作の何が問題だったのか」を理解することは、今後を考えたときに、もんのすごーく大事です。 焦らずじっくり理解を深めてください。 どうしても理解できないときこそ、teratailの出番です。 頑張って!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問