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

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

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

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

Q&A

解決済

2回答

580閲覧

for文の中で変数pは初期化されていない可能性がありますとなってしまう

langhtorn

総合スコア104

Java

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

0グッド

0クリップ

投稿2021/11/08 16:50

###実現したいこと
Boardの中でStoneの中のものを呼び出す。その際に中心の座標であるp.xp.yを代入していく。

###問題点
下記のようなエラーが出てきます。for文の中で一回一回初期化しなければならないのでしょうか。またそのようであればどのように初期化すればよいのでしょうか?

Reversi.java:87: エラー: 変数pは初期化されていない可能性があります p.x=px; //中心座標を定義 ^ エラー1個

###コード

java

1import java.awt.*; 2import javax.swing.*; 3 4//石に対応するクラス 5class Stone{ 6 public final static int black=1; //黒 7 public final static int white=2; //白 8 private int observe; //表面の色 9 //コンストラクタ 10 Stone(){ 11 observe=0; //非配置にする 12 } 13 14 //表面の色を設定する 15 void setObserve(int color){ 16 if(color==black || color==white){ 17 observe=color; 18 }else{ 19 System.out.println("黒か白でなければいけません"); 20 } 21 } 22 23 //表面の色で中心p,半径radの円を塗りつぶす 24 void paint(Graphics g,Point p,int rad){ 25 /*省略*/ 26 27 } 28} 29 30class Board{ 31 Stone[][] stone=new Stone[8][]; 32 33 //コンストラクタ 34 Board(){ 35 } 36 37 //画面描画 38 void paint(Graphics g,int unit_size){ 39 int rad=32; 40 41 /*省略*/ 42 43 int px=120,py=120; 44 for(int i=0;i<8;i++){ 45 for(int j=0;j<8;j++){ 46 stone[i][j].setObserve(0); 47 } 48 } 49 stone[3][3].setObserve(1); 50 stone[3][4].setObserve(2); 51 stone[4][3].setObserve(2); 52 stone[4][4].setObserve(1); 53 for(int i=0;i<8;i++){ 54 for(int j=0;j<8;j++){ 55 Point p; 56 p.x=px; //中心座標を定義 57 p.y=py; 58 stone[i][j].paint(g,p,rad); 59 py=py+80; 60 } 61 px=px+80; 62 } 63 } 64} 65 66 67public class Reversi extends JPanel{ 68 public final static int UNIT_SIZE=80; 69 Board board =new Board(); 70 71 //コンストラクタ 72 public Reversi(){ 73 setPreferredSize(new Dimension(800,800)); 74 } 75 76 //画面描画 77 public void paintComponent(Graphics g){ 78 board.paint(g, UNIT_SIZE); //Boardクラスのpaintメソッドを呼び出す 79 } 80 81 //起動 82 public static void main(String[] args){ 83 JFrame f=new JFrame(); 84 f.getContentPane().setLayout(new FlowLayout()); 85 f.getContentPane().add(new Reversi()); 86 f.pack(); 87 f.setResizable(false); 88 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 89 f.setVisible(true); 90 } 91 92 93}

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

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

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

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

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

jimbe

2021/11/08 17:54

全然ご質問と関係無いですが、 UNIT_SIZE が全く使われてないですね…。
guest

回答2

0

Point は、 JFrame や Reversi 、 Board 等と同じくクラスです。
ですので、それらと同じように new でインスタンスを設定しなければ NullPointerException が発生するでしょう。

投稿2021/11/08 17:36

jimbe

総合スコア12632

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

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

langhtorn

2021/11/08 17:45

ありがとうございます。
maisumakun

2021/11/08 23:28

ローカル変数については初期化しないパスがあると「コンパイルエラー」です(nullのない数値型でもそうです)。
guest

0

ベストアンサー

Pointクラスはjava.awt.Pointでしょうか?
そうだと仮定して回答します。
以下のようにする必要があります。

diff

1 for(int i=0;i<8;i++){ 2 for(int j=0;j<8;j++){ 3- Point p; 4+ Point p = new Point(); 5 p.x=px; //中心座標を定義 6 p.y=py; 7 stone[i][j].paint(g,p,rad); 8 py=py+80; 9 } 10 px=px+80; 11 }

もっとも、これならこうしたほうがいいですが。

diff

1 for(int i=0;i<8;i++){ 2 for(int j=0;j<8;j++){ 3- Point p; 4- p.x=px; //中心座標を定義 5- p.y=py; 6+ Point p = new Point(px, py); 7 stone[i][j].paint(g,p,rad); 8 py=py+80; 9 } 10 px=px+80; 11 }

投稿2021/11/08 17:33

swordone

総合スコア20651

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

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

langhtorn

2021/11/08 17:45

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問