- ベストアンサー
カード(ボタン)をクリックで選ぶ→決定
3枚のカード(Button)から一枚をクリックで選択して 決定ボタンであたりかはずれかを表示するプログラムを作りたいのですが クリックされたカードの情報を決定ボタンで結果を表示するresult関数に受け渡すときにエラーがでます。 適切な書き方をどなたか教えてください。 なおGameMouseAdapterクラスとGameWindowクラスは別々のjavaファイルになっています。 -----GameMouseAdapter.java-------------------------- import java.awt.event.*; public class GameMouseAdapter extends MouseAdapter{ private GameWindow gw; private int select; GameMouseAdapter(GameWindow gw){ this.gw=gw; } public void mouseClicked(MouseEvent e){ Object cmd = e.getSource(); if(cmd==gw.card[0]) select=0; if(cmd==gw.card[1]) select=1; if(cmd==gw.card[2]) select=2; if(cmd==kettei) gw.result(select); } }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>if(cmd==gw.kettei) gw.result(select);の行でNullPointer Exceptionエラーがでます。 この行でNullPointer Exceptionが出る原因を考えてみましょう。cmdがnullでも、nullとあるオブジェクト(gw.kettei)を比較するだけなのでExceptionは発生しません。gw.ketteiがnullでも同様です。selectは最初は0で初期化されています。gw.resultは関数だからnullとかいう概念は存在しませんね? というわけで、本当にここの行でNullPointerならばgwがnullなのでしょう。しかし、その上の行でgw.card[0]という行があるので、本当にNullPointerならば上で出てくるはずです。というわけで、私には現時点でここでExceptionが出る理由はわかりません。gw.resultの内部と言うのなら話はわかりますが。 何はともあれ、GameWindowのほうに原因があるはずなので、GameWindowの中身がわからないことにはだれも答えられないと思いますよ。これだけでわかるのはgwやselectをprivateにしているようにcardやketteiもprivateにしたほうがいいのではないですか?というアドバイスくらいです。
その他の回答 (3)
- PecoPlus
- ベストアンサー率76% (144/188)
こんにちは。 「変数selectが初期化されていない可能性があります」エラーじゃないでしょうか? カードのボタンを押さずにいきなり決定ボタンを押すと変数selectが一度も値を設定しないまま、resultメソッドに渡されてしまいますよね。 コンストラクタで、初期値を設定しておいたほうがよいと思います。 最初から選択状態のディフォルトのカードがあるというのなら、その値を。 無選択という状態を考慮するなら、-1でも入れておいて、resultメソッド内で無選択の場合の処理も考えておけば、よいと思います。
お礼
アドバイスありがとうございます。 初期値-1を設定してresultメソッドにその場合の処理を追加してみましたが、それでも実行時にエラーが起きます。 選択しても選択しなくても決定ボタンを押したところでコンソールにエラーがでます。
- Bonjin
- ベストアンサー率43% (418/971)
とりあえず、コンパイルエラーですか?実行時エラーですか?
補足
書き忘れていました。 コンパイルでエラーはなく、 実行したとき1枚カードを選んで決定ボタンを押すと if(cmd==gw.kettei) gw.result(select); の行でNullPointer Exceptionエラーがでます。
- meenie
- ベストアンサー率44% (40/90)
情報が少なくてはっきりとは言えませんが(私の力不足かな)、エラーになる原因は変数ketteiが見つからないためです。 GameMouseAdapterクラスでは宣言も定義もされていませんし、 別のクラスのstaticオブジェクトならクラス名の修飾が必要です。 例えば gw.kettei みたいに、何オブジェクト(クラス)がketteiを持っているのかを指定してあげましょう。
お礼
すみません。 if(cmd==gw.kettei){ の間違いでした。 補足ありがとうございます。
お礼
すみません。色々試したところGameWindowクラスにやはり問題があったようで、なおしたら動作しました。ありがとうございます。