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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

2回答

1944閲覧

java.lang.ArrayIndexOutOfBoundsExceptionの原因がわからない

leeev

総合スコア20

Java

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2020/10/08 12:48

編集2020/10/08 12:54

標準入力された迷路の最短経路を出力するアルゴリズムを書いたのですが、なぜか63行目でjava.lang.ArrayIndexOutOfBoundsExceptionが発生してしまいます。
配列dの宣言はきちんとしているはずなのですが、、、、原因がわかりません。

エラーメッセージ Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 at study.piece.bfs(maze.java:63) at study.piece.solve(maze.java:101) at study.maze.main(maze.java:23)
ソースコード package study; import java.nio.charset.StandardCharsets; import java.util.ArrayDeque; import java.util.Queue; import java.util.Scanner; public class maze { public static void main(String[] args) { Scanner sc = new Scanner(System.in,StandardCharsets.UTF_8); int N = sc.nextInt(); int M = sc.nextInt(); int sx,sy; //スタートの座標 int gx,gy; //ゴールの座標 String[][] field = new String[N][M]; for(int i = 0; i<N; i++) { String line = sc.next(); for(int j = 0; j<M; j++) { field[i][j] = String.valueOf(line.charAt(i)); } } piece pie = new piece(N, M,field); pie.solve(); } } class piece{ final int INF = 1000000000; int N,M; int sx,sy; //スタートの座標 int gx,gy; //ゴールの座標 String[][] field; piece(int N,int M,String[][] field){ this.N= N; this.M = M; this.field = field; for(int i = 0; i<N; i++) { for(int j = 0; j<M; j++) { if(field[i][j].equals("S")) { sx = i; sy = j; }else if(field[i][j].equals("G")) { gx = i; gy = j; } } } } int[][] d = new int[N][M]; //各点までの最短距離の配列 int[] dx = {1,0,-1,0}; int[] dy = {0,1,0,-1}; //(sx,sy)から(gx,gy)への最短距離を求める //たどり着けないとINF int bfs() { Queue<pair> que = new ArrayDeque<>(); //すべての点をINFで初期化 for(int i = 0; i<N; i++) { for(int j = 0; j<M; j++) { d[i][j] = INF; //63行目 } } //スタート地点をキューに入れ、その点の距離を0に que.add(new pair(sx,sy)); d[sx][sy] = 0; while(que.size() == 0) { //キューの先頭を取り出す pair p = que.element(); que.poll(); //取り出した状態がゴールならやめる if(p.x == gx && p.y == gy) { break; } //移動4方向をループ for(int i = 0; i<4; i++) { //移動したあとの天を(nx,ny)とする int nx = p.x + dx[i], ny = p.y + dy[i]; //移動が可能かの判定とすでに訪れたことがあるかの判定(d[nx][ny] != INFなら訪れたことがある) if(0<=nx && nx<N && 0<=ny && ny<M && field[nx][ny] != "#" && d[nx][ny] == INF) { que.add(new pair(nx,ny)); d[nx][ny] = d[p.x][p.y]+1; } } } return d[gx][gy]; } void solve() { int res = bfs(); System.out.println(res); } } class pair{ int x,y; pair(int x,int y){ this.x = x; this.y = y; } public int compareTo(Object ob){ return this.y - ((pair)ob).y; } }
標準入力されるN×Mの迷路の例 10 10 #S######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .####.###. ....#...G#

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

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

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

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

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

m.ts10806

2020/10/08 12:52

コードは全て1ファイルに書いているのでしょうか。 ファイル毎にコードブロックとしてもらいたいのですけど。 でないと行数が合いませんし、再現確認もとれません。 (動くのは動くのでしょうけど、クラス名は大文字始まりがJavaの命名規則です)
leeev

2020/10/08 12:56

コードは全て1つのファイルです。 コメントで63行目の注釈を追加しました。pieceクラスの中の配列dの要素をINFで初期化するところです。
guest

回答2

0

ベストアンサー

pieceクラス内

java

1 int[][] d = new int[N][M]; //各点までの最短距離の配列

これが書かれている場所は、ただのフィールドの宣言を行う場所です。
右辺の初期化が行われる時点では、N,Mも初期化されておらず、デフォルト値の0です。
書かれている順番としてはコンストラクタが先にありますが、それよりも先にここの処理が行われます。
正しく動かすためには、この部分もコンストラクタに含める必要があります。

投稿2020/10/08 13:04

swordone

総合スコア20649

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

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

leeev

2020/10/08 13:21

回答ありがとうございます。 コンストラクタの中に記述したところ無事動きました。 ありがとうございました。
guest

0

Index 0 out of bounds for length 0

配列のサイズが0なので、0でアクセスしたらダメダメ、とおっしゃってますが
そこの配列のサイズをチェックしてみたらどーでしょう

投稿2020/10/08 13:00

y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問