コマンドライン引数で入力した文字列を回文として出力するプログラムを作っています。
以下の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(); } }
回答1件
あなたの回答
tips
プレビュー