Java初心者の質問:JPanelを継承したクラスでNullPointerExceptionが発生する

このQ&Aのポイント
  • Java初心者の質問:JPanelを継承したクラスでStageをインスタンス化するとNullPointerExceptionが発生
  • Stage.javaのmass_x[0]に値を代入している行でNullPointerExceptionが発生
  • DrowMapクラスを継承しているため、ミスがあると思われる
回答を見る
  • ベストアンサー

配列

 Java初心者です。  RPGを作っているのですが、JPanelを継承したクラスのpaintComponentメソッドで、Stageをインスタンス化すると、 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException というエラーメッセージが表示されてしまいます。  エラーが発生している行は、Stage.javaで、mass_x[0]に値を代入しているところです。DrowMapクラスを継承しているので、その辺でミスをしているのだと思いますが・・・。 ------------Stage.java public class Stage extends DrowMap{  //コンストラクタ  public Stage(){   super();   //////////変数に値を代入(一部略)   //マップに使用する画像   mapImage = "/material/mapchip/s10.png";   //マップの作成   map_arrangement = new int[][]{            {1,1,1,1},            {1,0,0,0},            {1,0,0,0},            {1,1,1,1} };   mass_x[0] = 1;//ここでNullPointerExceptionが発生   mass_y[0] = 1;      mass_x[1] = 1;   mass_y[1] = 16;  } } ----------DrowMap.java abstract public class DrowMap{  //////////変数宣言(一部略)    //読み込んだマップチップから切り取って表示するマス  public int[] mass_x;  public int[] mass_y;  //表示されるマップの配列  public int[][] map_arrangement;    //使用するマップ画像  public String mapImage;    //使用するマップ画像の縦横のサイズ(単位:ピクセル)  public int mapImageSize_yoko;  public int mapImageSize_tate;  /**マップを描画*/  public void drowMap(Graphics g){   mapchip = ImageIO.read(getClass().getResource(mapImage));//try~catchは略   for(int i=0; i < tate; i++){    //マップのX座標を初期化    map_x = 0;    //マップのY座標=フレームの上枠+行数×チップサイズ    map_y = frame_top_border + i * MAPCHIP_SIZE;      for(int j = 0; j < yoko; j++){     //マップのX座標=(回数-1)×マップチップの大きさ+フレームの左枠     map_x = j * MAPCHIP_SIZE + frame_border;       //次に表示するマスの、チップの番号=map_arrangement[i][j]の値     int chipnumber = map_arrangement[i][j];        //画像ファイルから切り取る部分の左上のx座標     source_x = (mass_x[chipnumber] - 1) * MAPCHIP_SOURCE_SIZE;         //画像ファイルから切り取る部分のy座標     source_y = mass_y[chipnumber] * MAPCHIP_SOURCE_SIZE;    }      //マップの描画    g.drawImage(mapchip,    map_x,map_y,    MAPCHIP_SIZE,MAPCHIP_SIZE,    source_x,source_y,    source_x+MAPCHIP_SOURCE_SIZE,    source_y+MAPCHIP_SOURCE_SIZE,    frame);   }  } }  色々と試してみたのですが、解決しません。お分かりになる方いらっしゃいましたら、教えていただけないでしょうか。

noname#82539
noname#82539
  • Java
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
回答No.1

はじめまして。 NullPointExceptionが発生しているとのことですが、原因は配列で使用している変数を初期化していないからだと思われます。 配列は初期化しないと使用出来ません。 ですので、動的に変化しないのであれば、DrowMapクラスの変数「mass_x」は初期化しましょう!! 下のmass_yも同様ですね。 [DrowMap.java]   mass_x[0] = 1;//ここでNullPointerExceptionが発生   mass_y[0] = 1;      mass_x[1] = 1;   mass_y[1] = 16; ではなく   mass_x = new int[] { 1, 1 }   mass_y = new int[] { 1, 16 } になります。 動的に変更する必要がある場合は、List型を使用すれば大丈夫です。 その際、初期化することを忘れずに…。 ※配列は初期化(インスタンス化)しなければ使用出来ません。 それを守っていれば以降、大丈夫です!!

noname#82539
質問者

お礼

 ご回答ありがとうございます。うまくいきました。これでやっと先に進めます。  配列は初期化しないといけないのですね・・・。とりあえず解説書の配列の部分、見直してみます。

関連するQ&A

  • NullPointerExeption

     RPGを作成しているのですが、 Exception in thread "main" java.lang.NullPointerException というエラーメッセージが表示されてしまいます。 public static void main(String[] args) { MainPanel mainpanel = new MainPanel(); ←問題点その一 } /* 主となるメソッド */ public MainPanel(){ //スーパークラスのコンストラクタ(ウインドウ作成などの初期設定を行う) super(); //中略 //Mapクラスのインスタンス(何もしない) m = new Map(); //マップ描画 m.drowMap(Map.HotelRoom); ←問題点その二 //以下略 } これらの問題点はコンソールに表示されるだけですが、別にeclipse側で、 MainPanel mainpanel = new MainPanel(); のmainpanelに黄色い下線が表示され、「ローカル変数mainpanelは読み取られません」という警告が出されます。 又、以下はmap.Mapクラス(インポート済み)にあるdrawMapメソッドです。 public void drowMap(int mapName){ chooseMap(mapName); mapchip = ImageIO.read(getClass().getResource("/Resource/mapchip/" + mapImage));//try~catchは略 for(int i=0; i < tate; i++){  //マップのX座標を初期化  map_x = insets.left; ←問題点三  //マップのY座標=フレームの上枠+行数×チップサイズ  map_y = insets.top + i * MAPCHIP_SIZE;   /** 以下はあまり関係ないと思うけど、念のため・・・ **/  for(int j = 0; j < yoko; j++){   //マップのX座標=回数(0回目を最初とする)×マップチップの大きさ+フレームの左枠   map_x = j * MAPCHIP_SIZE +insets.left;   int chipnumber = map[i][j];   //横のマスの数   int chip_kazu_yoko = map[0].length;   //そのマップチップは何行目にあるか   int gyou = (int)chipnumber/chip_kazu_yoko;   source_y = gyou * MAPCHIP_SIZE;   source_x =chipnumber%chip_kazu_yoko;  } //マップの描画 g.drawImage(mapchip,map_x,map_y,MAPCHIP_SIZE,MAPCHIP_SIZE, source_x,source_y,source_x+MAPCHIP_SIZE/2,source_y+MAPCHIP_SIZE/2,frame); } } 問題点三にあるinsets.leftは、Mapクラスのスーパークラスで public Insets insets; と定義され、MainPanelで実行される、super()の中で、 insets = frame.getInsets(); のように値を取得しています。 環境はJDK&JRE 6 Update1、eclipse3.1.1です。 長い上にわかりにくくて非常に恐縮なのですが、よろしくお願いします。

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

    Javaのプログラムで、以下のように半径rでソートして並び替えて出力したいのですがどうやって作ればいいのでしょうか? ご教授願います。 0x座標は0 y座標は0 半径は48 1x座標は1 y座標は2 半径は42 2x座標は2 y座標は4 半径は5 3x座標は3 y座標は6 半径は75 4x座標は4 y座標は8 半径は21 0x座標は2 y座標は4 半径は5 1x座標は4 y座標は8 半径は21 2x座標は1 y座標は2 半径は42 3x座標は0 y座標は0 半径は48 4x座標は3 y座標は6 半径は75 半径の値はランダムです 自分では以下まで作りました。なるべく以下の形は変えないようにしたいです。 class Circle{ private int x,y,r,j; private static int i=0; Circle(int px,int py,int pr) { x=px; y=py; r=pr; } public static void show(Circle c){ System.out.println(i+"x座標は"+c.x+" y座標は"+c.y+" 半径は"+c.r); i++; } public static void sort(Circle c){ } } class Sample{ public static void main(String args[]) { Circle[] a=new Circle[5]; for(int i=0;i<a.length;i++) { a[i]=new Circle(i,2*i,(int)(Math.random()*100)); a[i].show(a[i]); } } }

  • Javaの配列の中身の並び替え

    数独の盤面上に、数字が0から9まであり、その数がそれぞれ何個あるのか数える プログラムを書きました。(0というのは、まだマス目がうまってない状態を指します) 以下のプログラムでは、ある座標に着目し、その座標が関連する行・列・ブロックに 数字が何個あるか数えています。(0のマスの数は特に気にしていません) final int x0 = x / 3 * 3; //000 333 666 final int y0 = y / 3 * 3; //その座標が関連するブロック、行、列に存在する値の数を数える //行 for( int i=0; i<9; ++i ){ countNum[state.getNum(i, y)]++; //state.getNum座標の数字を取得しています。 } //列 for( int i=0; i<9; ++i ){ countNum[state.getNum(x, i)]++; } //ブロック    for(int i=x0;i<3;i++){    for(int j=y0;j<3;j++){     if( i!=x || j!=y){ countNum[state.getNum(i, j)]++;    }    } これで、1の数字の個数や、2の数字の個数を求めることができました。 そして、個数の少ない順に並び替えたいのですが、並び替えてしまうと 何の数字が何個なのかわからなくなってしまいます。 どのようにすれば、数字とその個数がわかったまま並び替えをおこなえますか? 配列を二つ準備するべきなのでしょうか? 順番の入った配列と個数の入った配列。というように。

    • ベストアンサー
    • Java
  • 敵との当たり判定

    現在VisualC++2008でゲームを製作してるんですが 自分と敵との当たり判定がわかりません。 どのようにすればいいか教えてもらえないでしょうかm(_ _)m #define SCREEN_WIDTH (640) // 画面の横幅 #define SCREEN_HEIGHT (480) // 画面の縦幅 #define CHIP_SIZE (32) // 一つのチップのサイズ #define MAP_WIDTH (SCREEN_WIDTH / CHIP_SIZE) // マップの横幅 #define MAP_HEIGHT (SCREEN_HEIGHT / CHIP_SIZE) // マップの縦幅 #define CHAR_SIZE (30) // プレイヤーのサイズ float PlX, PlY ; // プレイヤーの座標(中心座標) int ActMain( void ) { // プレイヤーの座標を初期化 PlX = 100.0F ; PlY = 1.0F ; // マップ { int i, j ; for( i = 0 ; i < MAP_HEIGHT ; i ++ ) { for( j = 0 ; j < MAP_WIDTH ; j ++ ) { // 1のところだけ描画 if( MapData[i][j] == 1 ) { DrawBox( j * CHIP_SIZE, i * CHIP_SIZE, j * CHIP_SIZE + CHIP_SIZE, i * CHIP_SIZE + CHIP_SIZE, GetColor( 0, 0, 0 ), TRUE ) ; } } } } //プレイヤーの描写 DrawBox( ( int )( PlX - CHAR_SIZE * 0.5F ), ( int )( PlY - CHAR_SIZE * 0.5F ), ( int )( PlX + CHAR_SIZE * 0.5F ) + 1, ( int )( PlY + CHAR_SIZE * 0.5F ) + 1, GetColor( 255, 0, 0 ), TRUE ) ; Cr = GetColor( 255 , 255, 255 ) ; //敵の描写 DrawGraph(teki[0].x,teki[0].y,teki[0].img,TRUE); //初期化 void SYOKIKA(void){ teki[0].x=500; teki[0].y=200; teki[0].img=LoadGraph("red_player.bmp"); //当たり判定をつくったつもりですが反応せず・・・。一応あたったらPlXを0に移動させようとしています。 if(PlX==teki[0].x) PlX=0; if(PlX==teki[0].y) PlX=0; if(PlY==teki[0].x) PlX=0; if(PlY==teki[0].y) PlX=0; がソースです(文字数が足りないのであたり判定に関係ありそうな(敵と自分の座標関連)ところだけ抜きました)今のところ敵、自分、マップ表示や自分の移動などはできているのですが、敵に触れても反応せず、ときおり敵のいないまったく関係のない場所でPlXが0に移動したりしてしまいます ソースみづらくて申し訳ありません。

  • RPGゲームの簡単なプログラムを打ってみたんですがうまく表示されません

    RPGゲームの簡単な初歩的なサンプルプログラムを自分で打ってみたんですが、思った通りに表示されません。 以下のソースのどこかおかしいとこありますでしょうか。 #include<stdio.h> #include<windows.h> #define MAP_SIZE_Y 10 #define MAP_SIZE_X 10 int x = 4,y = 5; int j,i; int map[100][100] = { {1,1,1,1,1,1,1}, {1,0,0,3,0,0,1}, {1,0,0,0,0,0,1}, {1,0,2,0,2,0,1}, {1,0,0,0,0,0,1}, {1,1,1,1,1,1,1}, }; void DrawMap(){ for(j = 0; i < MAP_SIZE_Y; j++){ for(i = 0; i < MAP_SIZE_X; i++){ if(j == y && i == x){ printf("勇"); }else{ switch ( map[j][i]){ case 1: printf("■"); break; case 2: printf("兵"); break; case 3: printf("王"); break; default:printf(" "); break; } } } printf("\n"); } } void main(){ while(1) { system("cls"); DrawMap(); } }

  • c言語のmalloc関数と2次元配列について

    ・mallocとreallocのAPPを作成しています、下記は単純化しました。 「質問-1」 ・while(1){...以下を無効にした場合、正常に終了します。 ・有効にして、最初に999を入力した場合、エラー表示されます。 ・この理由が分かりません。 「質問-2」 ・有効にして、初期数値(例えば11)を入力の場合、正常表示されます ・続けて数値(例えば15)を入力した場合、エラー表示されます。 ・この理由が分かりません。 ***************************************************************  #include <stdio.h>  #include <stdlib.h>  void MylnOut(void);  int **map;  int X=10,Y=10,i,j; //************************************************************** // MAIN //************************************************************** int main() {  char str[64]={""};  char *s="変更数値を入力(999で終了).... "; /* 2次元配列確保と初期表示 */  map=(int **)malloc(sizeof(int *)*X);  for(i=0;i<X;i++)   map[i]=(int *)malloc(sizeof(int)*Y);  MylnOut(); /* 変更数値入力 */ // while(1){ //  printf(s); //  gets(str); //  X=atoi(str); //  if(X==999) break; /* 領域変更と表示 */ //  map=(int **)realloc(map,sizeof(int *)*X); //  for(i=0;i<X;i++) //   map[i]=(int *)realloc(map[i],sizeof(Y)); //  MylnOut(); // } /* 領域開放 */   for(i=0;i<X;i++) free(map[i]);   free(map);   return 0; } //************************************************************** // 入力・表示 //************************************************************** void MylnOut(void) {  for(j=0;j<Y;j++)   for(i=0;i<X;i++) map[i][j]=55;   for(j=0;j<Y;j++){    for(i=0;i<X;i++) printf("%3d",map[i][j]);    printf("\n");   } }

  • 配列について

    以下の配列についての問題でわからないことがあるので、教えてください。 /* x と y の積を求める。 */ #include <stdio.h> int main(void) { int x[2][3] = {{1,2,3}, {4, 5, 6}}; int y[3][2] = {{1, 5}, {5, 3}, {8, 1}}; int ans[2][2] = {0}; int i, j, k, temp; for(i = 0; i < 2; i++) { for (k = 0; k < 2; k++) { temp = 0; for(j = 0; j < 3; j++) { temp += x[i][j] * y[j][k]; } ans[i][k] = temp; } } for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { printf("%4d",ans[i][j]); } putchar('\n'); } return(0); } 以下の部分について詳しく説明してもらえないでしょうか? int ans[2][2] = {0};  int i, j, k, temp; for(i = 0; i < 2; i++) { for (k = 0; k < 2; k++) { temp = 0; for(j = 0; j < 3; j++) { temp += x[i][j] * y[j][k]; } ans[i][k] = temp; } }

  • DXライブラリでマップが作れません・・・。

    今DXライブラリとVisualC++2008を使ってゲーム(アクション)を作っているのですがマップが作れません・・・、構造体?をつかってマップの描写は成功したのですが、0のところに判定を持たせることができません・・・。どのようにすればいいのでしょうか?色々試してみてもできず困っています。 ソースの一部 #include"DxLib.h" #define MAP_SIZE 64 // マップチップ一つのドットサイズ #define MAP_WIDTH 10 // マップの幅 #define MAP_HEIGHT 8 // マップの縦長さ int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , } ; void HYOUZI(void); void SYOKIKA(void); struct dousa{ int power; int flag; }; struct dousa jump; struct zahyou { int x,y; int img; int flag; int muki_y; int muki_x; int x1; int x2; int x3; int x4; int y1; int y2; int y3; int y4; }; struct zahyou haikei; struct charcter { int x,y; int img; int flag; }; struct charcter ziki; struct map; //初期化 void SYOKIKA(void){ jump.flag=0; ziki.x=100; ziki.y=100; ziki.img=LoadGraph("red_player.bmp"); } //背景 void HYOUZI(void){ int i,j; for( i = 0 ; i < MAP_HEIGHT ; i ++ ) { for( j = 0 ; j < MAP_WIDTH ; j ++ ) { if( MapData[ i ][ j ] == 0 ) { DrawBox( j * MAP_SIZE , i * MAP_SIZE , j * MAP_SIZE + MAP_SIZE , i * MAP_SIZE + MAP_SIZE , GetColor( 255 , 0 , 0 ) , TRUE ) ; } } } DrawGraph(ziki.x,ziki.y,ziki.img,TRUE); ScreenFlip(); } //動き void ugoki(void){ int OldX , OldY ; OldX = ziki.x ; OldY = ziki.y ; if (CheckHitKey(KEY_INPUT_RIGHT) == 1){ ziki.x=ziki.x+4; } if (CheckHitKey(KEY_INPUT_RIGHT) == 1) if (CheckHitKey(KEY_INPUT_Z) == 1) { ziki.x=ziki.x+8; } if (CheckHitKey(KEY_INPUT_LEFT) == 1){ ziki.x=ziki.x-4; } if (CheckHitKey(KEY_INPUT_LEFT) == 1) if (CheckHitKey(KEY_INPUT_Z) == 1) { ziki.x=ziki.x-8; } if(ziki.x>640){ ziki.x=-10; } if(ziki.x<-10){ ziki.x=640; } //ジャンプ jump.power-=1; ziki.y -=jump.power; if(ziki.y>400){ jump.power=0; ziki.y=400; jump.flag=0; } if (CheckHitKey(KEY_INPUT_DOWN) == 1 && jump.flag == 0){ jump.power=30; jump.flag=1; } if (CheckHitKey(KEY_INPUT_UP) == 1 && jump.flag == 0){ jump.power=20; jump.flag=1; } if( MapData[ ziki.x ][ ziki.y ] == 0 ) { ziki.x = OldX ; ziki.y = OldY ; } } int WINAPI WinMain ( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { ChangeWindowMode(TRUE); if(DxLib_Init()==-1) { return -1; } SYOKIKA(); SetDrawScreen(DX_SCREEN_BACK); while(ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0){ HYOUZI(); ugoki(); ClearDrawScreen(); } DxLib_End(); return(0); } 分かる人がいたらぜひ教えてください(o_ _)o

  • 配列の逆順コピー

    for文を使って、配列xの並びを逆順にしたものを配列yにコピーするプログラムを作りたいのですがうまくいきません。どうすればよいでしょうか? #include<iostream.h> int main(void){ int i,j; int x[5]={1,2,3,4,5}; int y[5]; for(i=4;i>=0;i--){ for(j=0;j<5;j++){ x[i]=y[j]; } } for(j=0;j<5;j++) cout<<y[j]<<endl; return 0; }

  • セグメンテーション違反

    穴掘り方というやり方で迷路を作っています。 とりあえずすこしだけ作ってみて実行したらセグメンテーション違反が起こってしまいました。 解説お願いします。 次のサイトを参考にしています。ttp://www.ced.is.utsunomiya-u.ac.jp/lecture/2009/prog/p3/kadai4/5.html #include<stdio.h> #include<stdlib.h> #include<time.h> #define A 51 #define B 51 /*51ラ51マスの迷路*/ void initialize(int *x,int *y,int map[A][B]);  /*最初のステージ作成と座標決定*/ int dig(int *x,int *y,int map[A][B]);   /*道を作る*/ int main(void) { int x,y;   /*現在の座標*/ int map[A][B];    initialize(&x,&y,map); dig(&x,&y,map); map[1][0] = 2; map[A-2][B-1] = 2; for(y=0;y<B;y++){ for(x=0;x<A;x++){ if( map[x][y] == 0){ printf(" "); }else if( map[x][y] == 1){ printf("■"); }else if( map[x][y] == 2){ printf("..") ; } } printf("\n"); } } void initialize(int *x,int *y,int map[A][B]) { int i,h; for(i=0;i<A;i++){ for(h=0;h<B;i++){ map[i][h]=1; } } do{ *x=rand()%A; *y=rand()%B; }while(*x!=0 && *x!=A-1 && *y!=0 && *y!=B-1); } int dig(int *x,int *y,int map[A][B]) { int r,c,dx,dy,count=0; do{ r = rand()%4; switch(r){     /*道を進める方向を決める*/ case 0: dx = 0; dy = -1; break; case 1: dx = -1; dy = 0; break; case 2: dx = 0; dy = 1; break; case 3: dx = 1; dy = 0; break;    } if(*x+dx*2 <= 0 || *y+dy*2 <= 0 || *x+dx*2 >= A-1 || *y+dy*2 >= B-1 || map[*x+dx*2][*y+dy*2] == 0){ c = 0; count++; if(count ==4){     /*4方向とも進めなかったらループを抜ける*/ break; } }else if(map[*x+dx*2][*y+dy*2] == 1){ map[*x+dx][*y+dy] = 0; *x = *x + dx*2; *y = *y + dy*2; c =1; } }while(c==0); }