回答編集履歴

2

popの例外について

2021/01/07 09:49

投稿

momon-ga
momon-ga

スコア4826

test CHANGED
@@ -166,6 +166,12 @@
166
166
 
167
167
 
168
168
 
169
+ pusuした回数以上にpopを呼んだら例外が発生するのは、そのような実装になっているからです。
170
+
171
+ それが悪いとは言わないですが、例外の原因を特定できるように[自前で制御する](https://docs.oracle.com/javase/jp/8/docs/api/java/util/EmptyStackException.html)ことが多いと思います。
172
+
173
+
174
+
169
175
  そもそもint kのスコープが広いというのも推奨されないです。(今回のようなバグを発生させやすいから)
170
176
 
171
177
  whileの代わりに

1

追記

2021/01/07 09:49

投稿

momon-ga
momon-ga

スコア4826

test CHANGED
@@ -60,4 +60,124 @@
60
60
 
61
61
 
62
62
 
63
- FiguresQS.javaを、どう修正しても治りません。
63
+ ~~FiguresQS.javaを、どう修正しても治りません。~~
64
+
65
+
66
+
67
+ ごめんなさい。FigureQSを修正すると、もう少し動きそうです。
68
+
69
+
70
+
71
+ The contents of MyStack are as follows:
72
+
73
+ I am a Square with area900.0.
74
+
75
+ I am a Square with area0.0.
76
+
77
+
78
+
79
+ と、2個まで表示されているということは、2回pushしています。
80
+
81
+ 逆にいうと2回しかpushしていません。
82
+
83
+ 3回目のpushの時点で、ArrayIndexOutOfBoundsExceptionと思います。
84
+
85
+
86
+
87
+ インデックスkは、
88
+
89
+
90
+
91
+ なので、pushが8回動くように修正してください。
92
+
93
+
94
+
95
+ ---
96
+
97
+ > stackのtryの前にk=0;を入れたら動きました泣
98
+
99
+ なぜ動いたのか、動かなかった操作の何が問題だったのかまだ理解が曖昧
100
+
101
+
102
+
103
+ ```java
104
+
105
+ Figure[] figures1 = new Figure[9];
106
+
107
+ ```
108
+
109
+ と定義していて、
110
+
111
+ ```java
112
+
113
+ MyQueue queue = new MyQueue(7);
114
+
115
+ int k = 0;
116
+
117
+ try{
118
+
119
+ while(queue.isFull() == false) {
120
+
121
+ queue.put(figures1[k]);
122
+
123
+ k++;
124
+
125
+ }
126
+
127
+ ```
128
+
129
+ kを0~6まで使っているので、
130
+
131
+ `k = 0;`でリセットしない場合、
132
+
133
+ ```java
134
+
135
+ MyStack stack = new MyStack(8);
136
+
137
+ try {
138
+
139
+ while(stack.isFull() == false) {
140
+
141
+ stack.push(figures1[k]);
142
+
143
+ k++;
144
+
145
+ }
146
+
147
+ ```
148
+
149
+ で、stackにpushされるのは、kが、7と8の2回です。
150
+
151
+ ※stack.isFull()はfalseですが、kが9のときに例外が発生します。
152
+
153
+ 直後のcatchに遷移するのですが、処理が書いてないので、気づきにくいです。
154
+
155
+ ※例外を握りつぶすというバッドノウハウなのでやめましょう
156
+
157
+ ```java
158
+
159
+ } catch (ArrayIndexOutOfBoundsException e) {
160
+
161
+ // e.printStackTrace(); // とりあえずでも、これ書いておけば例外が発生したことは検知できる
162
+
163
+ }
164
+
165
+ ```
166
+
167
+
168
+
169
+ そもそもint kのスコープが広いというのも推奨されないです。(今回のようなバグを発生させやすいから)
170
+
171
+ whileの代わりに
172
+
173
+ ```java
174
+
175
+ for(int k = 0; queue.isFull() == false; k++) {
176
+
177
+ queue.put(figures1[k]);
178
+
179
+ }
180
+
181
+ ```
182
+
183
+ とすれば、Stackを使うときにkを再利用できないので、0リセットを忘れないようにできます。