Javaの配列部分でエラーが発生する理由は?

このQ&Aのポイント
  • Javaの配列部分でエラーが発生しています。マインスイーパを作成している際に、爆弾の位置をランダムに決めるプログラムですが、エラーが発生しています。
  • プログラムは9×9の配列を使用し、ランダムに10個の爆弾を配置するものです。しかし、何らかの原因でエラーが発生しており、解決方法がわかりません。
  • エラーの原因を特定するために、配列のインデックスを正しく指定しているか、ランダムな数値が適切に生成されているかなど、プログラムの各部分を確認しましたが、問題を特定することができませんでした。
回答を見る
  • ベストアンサー

javaの配列部分ででエラーがでます。

javaの配列部分ででエラーがでます。 マインスイーパを作っており爆弾の位置を決めるところでエラーの原因がわからず困っています。 9×9で、 ランダムでかぶらないように10個の爆弾を置くプログラムを作りたいです。 Random rnd=new Random(); int[][] mine=new int[8][8]; for(int i=0;i<=9;i++){ int yoko=(rnd.nextInt()>>>1)%9; int tate=(rnd.nextInt()>>>1)%9; if(mine[yoko][tate]!=10)mine[yoko][tate]=10; //爆弾があるところは10 else i--; } よろしくお願いします。

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
noname#130082
noname#130082
回答No.3

No.1さんのようにしないと、たぶん実行時に java.lang.ArrayIndexOutOfBoundsException が出ると思います。 配列の添え字は、0から8で、合計長さ9になりますが、new int[~][~]の~の部分は、最後の添え字の8ではなく、配列の長さの9を入れないといけません。 あと、できれば、for文のbodyでforの添え字に使われるiに関して、i--はやらずに別の方法がよいと思います。プログラムが読みにくく管理しずらくなるからです。

ainobakuda
質問者

お礼

そういうことだったんですか! 勘違いしていました。。。 エラーもまったくそのとおりです。 i--については他のやり方を検討してみます。 本当にありがとうございました!

その他の回答 (2)

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.2

どんなエラーですか?

  • byDesign
  • ベストアンサー率75% (45/60)
回答No.1

× int[][] mine=new int[8][8]; ○ int[][] mine=new int[9][9];

ainobakuda
質問者

補足

回答ありがとうございます。 配列って0から入っていくから8までで9個になると考えているんですが違うんでしょうか?

関連するQ&A

  • javaの配列でエラーが出ます。

    javaの配列でエラーが出ます。 先ほどもjavaの配列で質問させていただいたんですが、 また同じようなところでエラーが出ました。。。 マインスイーパーを作ろうとしているんですが、 周りにある爆弾の数を数えるところでエラーが出ます。 たびたび頼ってばかりで申し訳ありません。 一応自分なりに考えたのを以下に。。 爆弾があるというのはmine[][]==10であらわしています。 //フィールド int[][] mine=new int[9][9]; Random rnd=new Random(); //スレッド public void run(){ //爆弾生成 int yoko,tate; for(int i=0;i<=9;i++){ yoko=(rnd.nextInt()>>>1)%9; tate=(rnd.nextInt()>>>1)%9; if(mine[yoko][tate]!=10)mine[yoko][tate]=10; else i-- } kazugime(); }//本当はこの後に描画のループが続きます。 //数を代入するメソッド public void kazugime(){ int kazu=0; for(int i=0;i<=8;i++){ for(int j=0;j<=8;j++){ kazu=0; if(mine[i][j]!=10){ //上の段 if(i>=1&&j>=1){if(mine[i-1][j-1]==10)kazu++;} if(i>=1){if(mine[i-1][j]==10)kazu++;} if(i>=1&&j<=7){if(mine[i-1][j+1]==10)kazu++;} //真ん中の段 if(j>=1){if(mine[i][j-1]==10)kazu++;} if(j<=7){if(mine[i][j+1]==10)kazu++;} //下の段 if(i<=7&&j>=1){if(mine[i+1][j+1]==10)kazu++;} if(i<=7){if(mine[i+1][j]==10)kazu++;} if(i<=7&&j<=7){if(mine[i+1][j+1]==10)kazu++;} mine[i][j]=kazu; } } } エラーは Uncaught exception java/lang/ArrayIndexOutOfBoundsException です。 足らない部分があればご指摘お願いします。 どうかよろしくお願いします。

    • ベストアンサー
    • Java
  • JAVAで配列を使って * を縦向きのグラフで表示したいです。

    JAVAの勉強をしています。 このプログラムは配列に乱数を生成して * を 横向きにするプログラムです。 練習問題で、以下のプログラムを書き換えて、* を縦向きのグラフで表示する問題なのですが、解く方法がわかりません。 どなたか答えもしくはヒントを下さい。 よろしくお願いします。 import java.util.Random; import java.util.Scanner; public class Test06_04 { public static void main (String[] args) { Random rand = new Random(); Scanner stdIn = new Scanner(System.in); System.out.print("要素数 : "); int n = stdIn.nextInt(); //要素数を読み込む int[] a = new int[n]; //配列を生成 for (int i = 0; i < n; i++) { a[i] = 1+ rand.nextInt(10); } for (int i = 0; i < n; i++) { System.out.print("a[" + i + "] : "); for (int j = 0; j < a[i]; j++) System.out.print('*'); System.out.println(); } } }

    • ベストアンサー
    • Java
  • javaのプログラム

    int型の配列の各要素に1~10の乱数を代入し、各要素の値を縦向きの*のグラフで表示するプログラムを作っているのですが、結果がランダムででるので、自分の書いたプログラムが正しいのかわかりません。ソースを載せますので合っているのか間違っているか教えて下さい。もし間違っているならどこが間違いなのか教えていただけると嬉しいです。よろしくお願いします。 ●ソース import java.util.Random; import java.util.Scanner; class Graph { public static void main(String[] args){ Random rand = new Random(); Scanner stdIn = new Scanner(System.in); System.out.print("要素数:"); int n = stdIn.nextInt(); int a[] = new int[n]; for (int i = 0; i < n; i++) a[i] = 1 + rand.nextInt(10); for (int i = 1; i <= 10; i++){ for (int j = 0; j < n; j++) if (a[j] <= i) System.out.print("* "); else System.out.print(" "); System.out.println(); } } } ●実行例 要素数:12 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

    • ベストアンサー
    • Java
  • 簡単なマインスイーパーをJavaで作りたいです。

    Javaの勉強をしたいと思い下のソースのマインスイーパーを ウィンドウ上で実行できるようにしたいです。 そのときに他のソースから呼び出す形にしたいです。 どのようにしたら良いでしょうか?教えてください。 出来ればソースがあるとありがたいです。 import java.util.Scanner; public class MineSweeper extends MinePrinter { public static void main(String[] args) { Scanner sc = new Scanner(System.in); MineSweeper game = new MineSweeper(); game.displayStrblock(); while (!game.dead) { System.out.println("\n:爆弾数・・・" + game.mines); System.out.println("\n:場所を選んでください"); System.out.println("縦の場所の数字を入力"); int tate = Integer.parseInt(sc.next()); System.out.println("横の場所の数字を入力"); int yoko = Integer.parseInt(sc.next()); game.mineClick(tate, yoko); game.displayStrblock(); } } } class MinePrinter { String[][] strblock = new String[5][5]; int[][] blocks = new int[5][5]; int mines = 0; boolean dead = false; public MinePrinter() { mineSet(); } void mineClick(int i, int j) { if (aroundManyMines(i, j) == 99) { System.out.println("burst!!!"); System.out.println("You Dead!!\n"); strblock[i][j] = "*"; dead = true; } else { strblock[i][j] = Integer.toString(aroundManyMines(i, j)); } } void mineSet() { for (int i = 0; i < blocks.length; i++) { for (int j = 0; j < blocks[i].length; j++) { if (Math.random() < 0.2) { blocks[i][j] = 99; mines += 1; } else { blocks[i][j] = 0; } } } for (int i = 0; i < strblock.length; i++) { for (int j = 0; j < strblock.length; j++) { strblock[i][j] = "#"; } } } void displayStrblock() { for (int i = 0; i < strblock.length; i++) { for (int j = 0; j < strblock.length; j++) { System.out.print(strblock[i][j] + " "); } System.out.println(":" + i); } } int aroundManyMines(int i, int j) { if (blocks[i][j] == 99) { return 99; } int ans = 0; for (int r = -1; r <= 1; r++) for (int c = -1; c <= 1; c++) { try { if (blocks[i + r][j + c] == 99) { ans += 1; } } catch (ArrayIndexOutOfBoundsException e) { continue; } } return ans; } }

    • ベストアンサー
    • Java
  • dokojavaでシンボルerrorがでます。

    -------------------------------------isbn978-4-8443-3638-9 public class Main { public static void main(String[] args){ System.out.println("運勢"); int fortune = new java.util.Random() .nextInt(4) + l; if (fortune == 1) { System.out.println("大吉"); } else if (fortune == 2){ System.out.println("中吉"); } else if (fortune == 3){ System.out.println("吉"); } else{System.out.println("凶"); } } } ----------------------------------- int fortune = new java.util.Random() .nextInt(4) + l; ↑の最後の「l;」がみつかりませんとシンボルerrorになります。

  • 乱数を発生させて、それを配列して小さい順に並べる

    乱数の発生のさせ方は、質問集で見て import java.util.Random; class ransuu { public static void main(String args[]) { Random rand = new Random(); for ( int i = 0; i <10; i++){ int x = rand.nextInt(9); System.out.println(x); } } } を用いて表示できたのですが、そのあとの配列がよく分かりませんのでぜひ教えてください。ちなみに私の持っているテキストには任意の数(22、80、57、60、50など)を並べ替えるというものはあるのですが、今回のような乱数+配列の例が載っていないのでよく分かりませんでした。

    • ベストアンサー
    • Java
  • javaの配列

    javaの配列なんですが、配列の全要素一気にメソッドを実行させることができますか? 例えば、 Turtle[] hm = new Turtle[3]; for(int i = 0; i < 3; i++){ hm[i] = new Turtle(); } と配列を生成し、fd(int s)←[sピクセル前進]というメソッドを配列の全部の要素を順番ごとにではなく全部同時に実行させたい場合、コードはどのように書けばよいのでしょうか?

    • ベストアンサー
    • Java
  • javaで配列の格納をしたいです。

    配列の格納がうまくいきません。 javaについて質問させて頂きます。 ユーザーが数字を入力し配列 atr[ i ]に格納され 配列 v[ i ] に v[ 0 ] = count ... v[ 143 ] = count ... v[ 144 ] = count - 1 ... v[ 287 ] = count - 1 ... ... v[ count-288 ] = 2 ... v[ count-145 ] = 2 ... v[ count-144 ] = 1 ... v[ count-1 ] = 1 と、格納されるようなプログラムを作っています。 for文で作ろうと考えたのですが count, count-1 , ... 3, 2, 1と値を入れようと思いましたがうまくコンパイルが通りませんでした。 エラーは以下になります。 a.java:48: シンボルを見つけられません。 シンボル: メソッド readLine(int) 場所 : java.io.BufferedReader の クラス value = br_v.readLine(atr[i]); もし宜しければアドバイスやご指摘を頂けませんでしょうか。 説明も拙い部分がありますが宜しければお願いします。 import java.io.*; import java.util.Arrays; class a { public static void main(String[] args) throws IOException { int atr[]; atr = new int[25]; int count = 0; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(true){ //絶対に通る String str = br.readLine(); int res = Integer.parseInt(str); if(res == 0){ break; } else{ atr[count] = res; } count++; } for(int i=0; i<count; i++){ System.out.println(atr[i] + "が、選択されました。"); } int v[] = new int[25*144]; String value; try{ BufferedReader br_v = new BufferedReader(new InputStreamReader(System.in)); for(int i=count; i<count; i--){ value = br_v.readLine(atr[i]); v[i] = Integer.parseInt(value); } } catch(IOException e){ System.out.println("エラーです。"); } } }

  • JAVA初心者です。

    以下の文法でコンパイルエラーが出ます。 添削をお願いします。 import java.util.Random; public class Test{ public static void main(String[] args){ int n; for (n = 0; n < 200; n++){ int i; for (i = 0; i < 38; i++) { Random rnd = new Random(); int ran = rnd.nextInt(10); System.out.print(ran); System.out.print(" "); for (t = 0; t < 200; t++) } System.out.println(); } } }

    • ベストアンサー
    • Java
  • JAVAで配列の要素に、負の値が入力されたらに再入力させたいです

    JAVAで多次元配列の要素に、負の値が入力されたらに再入力させたいです int[][] a = new int[10][10]; ↑このような配列を扱うので、以下のような変数にたいしてfor文を使ったシンプルな方法は使い勝手が悪いです。 何か良い方法はありませんか? ------------------------------------------------------------------- int x = 0; for (int i = x; x <= 0;) { System.out.println("番号 : "); x = stdIn.nextInt(); }

専門家に質問してみよう