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

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

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

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

配列

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

Q&A

解決済

1回答

992閲覧

実行時エラーの解決がわかりません( java.lang.ArrayIndexOutOfBoundsException: -1)

Jhon_McClane

総合スコア48

Java

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

配列

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

0グッド

0クリップ

投稿2019/10/12 12:43

編集2019/10/13 15:38

コマンドライン引数で入力した文字列を回文として出力するプログラムを作っています。
以下のMianクラス、Reversionクラス、Stackクラスからこのプログラムは構成されています。
実行時に以下のようなエラーが発生しました。vineLinux 6.1の環境です。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at Stack.isFull(Stack.java:88)
at Stack.push(Stack.java:45)
at Reversion.reverse(Reversion.java:49)
at Main.main(Main.java:22)

解決するにはどうしたらよいでしょうか。

コード /** メイン・クラス * <PRE> * 問題1の解決手順を定義するmainメソッドをもつ * 解決手順はつぎのとおり操作はつぎの2つ * </PRE> * <OL> * <LI> 語をコマンドライン引数として入力する * <LI> 入力された語の数だけ「語を反転する」を繰り返す * <OL> * <LI> この時「語の反転」を行うオブジェクトreversionを対象の語args[i]を与えて生成し、 * <LI> reversionにreverse()を依頼する。 * <LI> 結果を表示する。 * </OL> * </OL> * @author Matsuura Saeko * @version 1.0 */ public class Main{ public static void main(String[] args){ for (int i = 0; i < args.length; i++){ Reversion reversion = new Reversion(args[i]); reversion.reverse(); System.out.println(reversion); } } }/** 語の反転・クラス * <PRE> * 対象の語(文字列)に対して、語(文字列)を反転するクラス * 主な操作はつぎの2つ * </PRE> * <OL> * <LI> void reverse() * <LI> String toString() * </OL> * @author Matsuura Saeko * @version 1.0 */ class Reversion{ /** * 対象の語 * */ private String target; /** * 結果の語 * */ private String result; /** * 処理対象の入力を与えて反転オブジェクトを生成するコンストラクタ。<BR> * result は空文字列で初期化する。 * */ Reversion(String target){ this.target = target; this.result = ""; } /** * 対象の語を反転した語を結果の語とするメソッド。<BR> * フィールド target を処理し、resultに結果を代入する。<BR> * 手順は以下の通り。 * <OL> * <LI> 語の長さを測る。 * <LI> その長さのStackを生成する。 * <LI> 1文字ずつスタックに積む。 * <LI> スタックから1文字ずつ取り出し、連結してresultに格納する。 * </OL> * @see Stack */ public void reverse(){ int length = this.target.length(); Stack stack = new Stack(length); stack.push(this.target);//引数必要 for(int i=0;i<length;i++){ result = stack.pop().toString(); } stack.show(); } /** * 語の反転オブジェクトの文字列化メソッド <BR> * ObjetクラスのtoStringメソッドのオーバーライド * @return (入力の語,出力の語)を返す。 */ public String toString(){ return "入力の語:"+target+"//出力の語:"+result; } } /** スタック・クラス * <PRE> * 後入れ先出しのデータ構造であるスタックのクラス。 * 主な操作はつぎの2つである。その他はメソッドの説明を参照のこと。 * </PRE> * <OL> * <LI> void push(Object element) * <LI> Object pop() * </OL> * @author Matsuura Saeko * @version 1.0 */ public class Stack{ /** * スタックのデータをObjectの配列で定義する。 * */ private Object[] stack; /** * スタックの大きさ * */ private int size; /** * スタックに要素が入っている最上位の位置。 */ private int top; /** * スタックの大きさを指定してスタックを生成する。<BR> * はじめは空である。 */ Stack(int size){ this.size = size; stack = new Object[this.size]; } /** * スタックに要素を入れる。<BR> * スタックが満杯ならば、エラーメッセージを標準出力に表示する。 * @param element 要素 */ public void push(Object element){ if( isFull() == false ){ for(int i=0;i<size;i++){ stack[i] = element.toString().charAt(i); top++; } } } /** * スタックから最上位の位置にある要素を取り出す。<BR> * 最上位の要素を返し、スタックからその要素を取り除く。 * @return スタックが空ならば、エラーメッセージを標準出力に表示してnullを返す。 */ public Object pop(){ if(isEmpty() == true) return null; return this.stack[this.top--]; } /** * スタックの最上位の位置にある要素を取り出す。<BR> * 最上位の要素を返すのみで、スタックの状態は変わらない。 * @return スタックが空ならば、エラーメッセージを標準出力に表示してnullを返す。 */ public Object top(int top){ if( isEmpty() == true ) return null; return this.stack[this.top]; } /** * スタックが空であるかを判定する。 * @return 空であればtrue、空でなければfalseを返す。 */ boolean isEmpty(){ if(stack[0] == null){ return true; } else{ return false; } } /** * スタックが満杯であるかを判定する。 * @return 満杯であればtrue、満杯でなければfalseを返す。 */ boolean isFull(){ if(stack[size-1] == null){ return false; }else{ return true; } } /** * スタックの内容を標準出力に出力する。 */ void show(){ System.out.println(this); //自分自身のインスタンスを表してます //this.toString() //をprintlnしているってことで } /** * スタックを文字列化する。<BR> * ObjetクラスのtoStringメソッドのオーバーライド * @return スタックのtopからbottomまでの内容を文字列として返す。 */ public String toString(){ return stack.toString(); } }

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

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

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

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

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

y_waiwai

2019/10/12 13:36 編集

このままではコードが見づらいため、質問を編集し、<code>ボタンを押し、出てきた’’’の枠の中にコードを貼り付けてください
Jhon_McClane

2019/10/12 14:39

y_waiwai様ご指摘ありがとうございます。
jimbe

2019/10/12 18:23

全て最新のソースでコンパイルされていますでしょうか. ソースを修正してコンパイルを忘れ「動かない」という場合があります.
Jhon_McClane

2019/10/13 06:51

jimb様、3つともコンパイルした結果あらたにエラーが生じましたので編集して投稿いたします。
guest

回答1

0

ベストアンサー

java

1 Stack(int size){ 2 stack = new Object[this.size]; 3 4 5 }

Stackの初期化時、引数に渡ったsizeを使わず、this.sizeを使用しています。this.sizeはどこでも初期化されていないため、デフォルト値の0になります。
そのため、pushを呼んだときの最初のisFull判定の時、

java

1 boolean isFull(){ 2 if(stack[size-1] == null){ 3 return false; 4 }else{ 5 return true; 6 } 7 }

stack[-1]を参照しようとして落ちます。

ひとまずこの点に関しては、thisをなくせば解決するのですが、それ以外にもこれらのクラスにはツッコミどころが満載で、ちまちま修正してたら大変なので、最初から作り直すことをお勧めします。
そもそも回文、というよりは逆転?した文字列を作りたいなら(サロゲートペアがない限り)char配列で事足りますからね。

具体的に言うと、Stackクラスのpushメソッドだけ取り上げても、

  • Objectで配列宣言している割に、pushで詰めているのはcharのみ。char配列で十分。
  • 満杯判定が最初だけのため、空き容量より長い文字列になるものをpushすると例外が発生する。
  • ループのたびに引数ObjectをtoStringしている。引数がStringならいいが、他のオブジェクトが入った場合、同じ文字列化をループする分繰り返すことになる。ループに入る前に1回で十分。

こんな感じで、他についても多数おかしな点があります。

投稿2019/10/13 09:00

編集2019/10/13 15:39
swordone

総合スコア20651

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

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

Jhon_McClane

2019/10/13 15:35

コードを手直しましたが、別のエラーが生じてしまいました。 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at Stack.pop(Stack.java:64) at Reversion.reverse(Reversion.java:51) at Main.main(Main.java:22) 解決方法を教えてください
swordone

2019/10/13 17:10 編集

編集で書きましたが、これは小手先で直そうと思っても手間がかかります。 最初から作り直してください。 そして、一気に作るのではなく、一つ一つ検証しながら作ってください。
swordone

2019/10/13 15:42

ところでこれは、「スタックを作ってそれを使う」というのは必須なのでしょうか?
Jhon_McClane

2019/10/14 01:13

必須です。わかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問