アプリ版:「スタンプのみでお礼する」機能のリリースについて

また恥を忍んで理解の為動かないソースを載せます。
idexの入力値が1だとしてnの入力値が3の話をします
このソースを実行させると以下の例外が出力されます
java.lang.ArrayIndexOutOfBoundsException
この例外の意味は不正なインデックスを使って配列がアクセスされたときに発生する例外と意味です。
ではなんでjava.lang.ArrayIndexOutOfBoundsException出力されるんですか
メソッド部分のint[] tmp=new int[a.length-n];
for(int i=idex+n; i<a.length; i++){
tmp[i]=a[i];
}
return tmp;
}
はtmpは配列aの長さ分-nですから配列2番目まで入ることはわかっています
で次のカウントアップさせる変数int宣言して i=idex+n;を i<a.length; i++をしていますからidexが1でnが3だったら4で4<6になるんじゃないんですか?

import java.util.Scanner;


public class Ensyuu725 {

/**
* @param args
*/
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);

int []a=new int[]{1,3,4,7,9,11};
for(int i=0; i<a.length; i++){
System.out.println("配列aの要素は"+"a["+i+"]"+a[i]);
}

System.out.print("削除する a[idx]:");
int idex=sc.nextInt();

System.out.print("a[idex]から何個削除しますか?");
int n=sc.nextInt();

int k[]=arrayRmvOfn(a,idex,n);


for(int i=0; i<k.length; i++){
System.out.println("配列aが消された後の要素は"+"k["+i+"]"+k[i]);
}

}

/**
* @param a
* @param idex
* @param n
* @return tmp
*/
private static int[] arrayRmvOfn(int[] a, int idex, int n) {

int[] tmp=new int[a.length-n];
for(int i=idex+n; i<a.length; i++){
tmp[i]=a[i];
}
return tmp;
}

}
ご指導お願いします。

A 回答 (4件)

・a.length: 6


・idx: 1
・n: 3
のとき、
・tmp.length: 3
・iの変化する範囲: 4~5
です。
tmp[]の添字は0~2だけが有効なので、tmp[i]に値を代入しようとしたらArrayIndexOutOfBoundsExceptionが出るのは当然。
    • good
    • 0
この回答へのお礼

返すは配列は0から2までなのに4~5の範囲の値を代入してしまって例外出力されたんですね
そりゃ起きますね、なんで質問するときまではわからなかったんだろ

お礼日時:2012/12/09 19:04

> for(int i=idex+n; i<a.length; i++){



> int[] tmp=new int[a.length-n];
と宣言しているのだから、 tmpで使える添字は
tmp[0] から tmp[a.length-n-1] までですよね?

> for(int i=idex+n; i<a.length; i++){
> tmp[i]=a[i];

ということは、このforループでは
tmp[idex+n] = a[idex+n] ;
tmp[idex+n+1] = a[idex+n+1] ;
...
tmp[a.length-1] = a[a.length-1] ;
を実行しようとする。
nが1以上なら a.length-n-1< a.length-1 であり、 tmp[a.length-1] が不正なのはあきらか。



「プログラムは思った通りに動かない。書いた通りに動く」という格言があります。
「自分はこう思う」と確信していても、動作が思い通りでないなら、まずは、自分が間違っている、と考えることです。
デバッガを使うなり
for(int i=idex+n; i<a.length; i++){
System.out.println("tmp[" + i + "] = a[" + i + "] =" + a[i]);
tmp[i]=a[i];
}
等と途中経過を出力するなりすれば、あなたの思った通りに動いてないことがすぐわかるはずです
    • good
    • 0
この回答へのお礼

「プログラムは思った通りに動かない。書いた通りに動く」
いい言葉です。自分はこうだと思っても動作が違うなら決めつけないようにします

お礼日時:2012/12/09 19:07

>int[] tmp=new int[a.length-n];


>for(int i=idex+n; i<a.length; i++){
>tmp[i]=a[i];
>}

tmpで扱える添え字の範囲と、iの値をよく考えてみましょう。
    • good
    • 0

 こんにちは



private static int[] arrayRmvOfn(int[] a, int idex, int n) {

  int[] tmp=new int[a.length-n];
  for(int i=idex+n; i<a.length; i++){
    tmp[i]=a[i];
     ↑
    ここがヒント
  }
  return tmp;
}

 配列 tmp と a は、同じ添え字でいいんですか?
    • good
    • 0
この回答へのお礼

ダメですね、質問してわかりました
云われてみれば配列tmpの範囲は0から2まで、iは4~5まですね
そりゃ例外されて当たり前な話でしたね、なんでこんなこと気づかなかったんだろ・・・
逆にa[i]を代入する返す配列tmpのiにn個分まで引いたらいけそうです

お礼日時:2012/12/09 19:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!