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

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

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

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

Q&A

1回答

1419閲覧

EffectiveJava 2nd 第6項目のサンプルが正しくうごかない

nyahonyaho

総合スコア83

Java

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

0グッド

0クリップ

投稿2017/12/07 00:50

編集2017/12/07 01:23

eclipseNEON+Java8にて掲題のサンプルソースを組んで実行してみると、実行するたびにStackクラスのsizeが想定外の値になります。

new時に -1 になったり、インクリメント・デクリメントするタイミングじゃないのに値が変わったりします。

原因はソース?eclipse?

public class Main { public static void main(String[] args) { Stack st = new Stack(); st.push("1"); st.push("2"); st.push("3"); Object o1 = st.pop(); Object o2 = st.pop(); Object o3 = st.pop(); } } public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack () { this.elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push (Object e) { ensureCapacity(); elements[size++] = e; } public Object pop () { if (size == 0) { throw new EmptyStackException(); } return elements[size--]; } private void ensureCapacity() { if (elements.length == size) { elements = Arrays.copyOf(elements, 2 * size + 1); } } }

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

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

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

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

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

swordone

2017/12/07 01:19

mainでの実行コードもお願いします。
guest

回答1

0

まず自分が気づいたバグの指摘をします。

インクリメント・デクリメント演算子は「副作用」と「演算結果の値」の両方に注意する必要があります。副作用とは演算子の対象となる変数の値が変化することですが、

++var // (A)

var++ // (B)

では「演算結果の値」が「副作用」の前の値なのか後の値なのかが変わります。(A)は副作用の後の値が結果の値になります。(B)は副作用の前の値が結果の値になります。

例えばvarの値が0の状態では(A),(B)ともにvarは1になりますが、(A)の結果の値は1, (B)の結果の値は0です。

この仕様を把握した上でご自分のコードをよく吟味してください。


次に質問の仕方についてアドバイスめいたことを・・・

new時に -1 になったり、インクリメント・デクリメントするタイミングじゃないのに値が変わったりします。

状況の説明が不十分ではないでしょうか?sizeのことをいっているならnewしたばかりの状態で-1になったりはしません。あなたはStackクラスのコードしか提示していませんが、それを使う側のコードがあるはずなので、少なくとも肝心な部分だけでも提示しないと閲覧者に状況が把握しづらいです。

原因はソース?eclipse?

JavaのランタイムやEclipseがそのようなおかしな振る舞いをするとは考えにくいです。大抵の場合プログラマー自身の間違いであることがほとんどです。情報不足なので100%絶対そうとは言い切れませんが、多分原因はあなたのソースコードと思います。

※Mainクラスにて↓を普通にnewしてpush・popを繰り返しているだけです

それはあなたがそう思っているだけかも知れません。本当にそうかどうかは実際のコードを見せた方が時間の節約ですよ?質問の際にはあなたの考えだけでなく「事実=実際のコード」を提示することが大事です。

投稿2017/12/07 01:25

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問