ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのNullPointerExceptionの改善

  • mixiチェック
  • このエントリーをはてなブックマークに追加
下のプログラム(?)をコンパイルして実行したところ、次のようなエラーが出てしまいました。

C:\Documents and Settings>java Test
Exception in thread "main" java.lang.NullPointerException
at Lesson2_6.<init>(Lesson2_6.java:16)
at Lesson2_6.main(Lesson2_6.java:29)

これを改善するにはこのプログラムのどこを直せばいいのかをご教授下さい。
プログラムの内容は、実行したら実行画面が出て、2つのテキストフィールドに数字を1つずつ入力し、値が同じかどうかを識別するもののつもりです。
「〜の内容はこの流れ的にはおかしい」みたいな意見も大歓迎です。
どうかよろしくお願いしますm(_ _)m
<JDK6で作成>
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Test extends JFrame {
TileTrailer testTrailer;
JButton setParam;
JTextField tilePos;
JTextField trailPos;
JLabel stat;
Test() {
setParam=new JButton("設定");
tilePos=new JTextField("0",3);
trailPos=new JTextField("0",3);
testTrailer=new TileTrailer();
stat=new JLabel(testTrailer.getPosition()+":"+testTrailer.getGameTile().getPosition());
setParam.addActionListener(new changeStat());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Test");
getContentPane().setLayout(new FlowLayout());
getContentPane().add(tilePos);
getContentPane().add(trailPos);
getContentPane().add(setParam);
getContentPane().add(stat);
setSize(300,100);
setVisible(true);
}
public static void main(String argv[]) {
new Test();
}
class changeStat implements ActionListener {
public void actionPerformed(ActionEvent e) {
String com = e.getActionCommand();
String right;
testTrailer.getGameTile().setPosition(Integer.parseInt(tilePos.getText()));
testTrailer.setPosition(Integer.parseInt(trailPos.getText()));
if(testTrailer.isRightPosition()) right=":同値";
else right=":非同値";
stat.setText(testTrailer.getPosition()+":"+testTrailer.getGameTile().getPosition()+right);
}
}
}
class TileTrailer extends JPanel implements MouseListener{
GameTile ownTile;
boolean enable=false;
static final int NONUM=-1;
int trailerPosition;
public TileTrailer(GameTile tile,int position){
ownTile=tile;
trailerPosition=position;
if(tile==null){
GameTile ownTile;
trailerPosition=NONUM;
}
}
public int getPosition(){
return trailerPosition;
}
public void setPosition(int trailer){
this.trailerPosition=trailer;
}
public boolean isRightPosition(){
if(isRightPosition()){
return true;
}
else{
return false;
}
}
GameTile getGameTile(){
return ownTile;
}
void setGameTile(GameTile own){
ownTile=own;
}
public TileTrailer(){
GameTile ownTile;
trailerPosition=NONUM;
addMouseListener(this);
}
public void paint(Graphics g){
g.drawImage(ownTile.getImage(),0,0,getWidth(),getHeight(),this);
g.setColor(Color.white);
g.drawRect(0,0,getWidth()-1,getHeight()-1);
}
public boolean isEnabled(){
return enable;
}
void setEnable(boolean en){
enable=en;
}
public void mouseClicked(MouseEvent e){
if(isEnabled()){
ownTile.reverseStat();
this.repaint();
}
}
public void mouseEntered(MouseEvent e){
}
public void mouseExited(MouseEvent e){
}
public void mousePressed(MouseEvent e){
}
public void mouseReleased(MouseEvent e){
}
}
class GameTile{
boolean tileStat;
int tilePosition;
static final int NONUM=-1;
ImageIcon face,back;
GameTile(String pic,boolean stat,int position){
if(pic==null){
face=new ImageIcon("unknown.jpg");
}
else{
face=new ImageIcon(pic);
}
back=new ImageIcon("back.jpg");
tileStat=stat;
tilePosition=position;
}
Image getImage(){
if(tileStat==true){
return face.getImage();
}
else{
return back.getImage();
}
}
int getPosition(){
return tilePosition;
}
void setPosition(int tilePosition){
this.tilePosition=tilePosition;
}
GameTile(boolean tileStat,int tilePosition){
this(null,tileStat,tilePosition);
}
boolean getStat(){
return tileStat;
}
void reverseStat(){
if(tileStat==false){
tileStat=true;
}
else{
tileStat=false;
}
}
public String toString(){
if(tileStat==true){
return "*";
}
else{
return ".";
}
}
GameTile(){
this(null,false,NONUM);
}
}

コメント(12)

>at Lesson2_6.<init>(Lesson2_6.java:16)

>これを改善するにはこのプログラムのどこを直せばいいのかをご教授下さい。

16行目。
言葉足らずだったようですみません(汗
改善できるのはクラスTileTrailerの内容だけとさせてください…
>2
それを加えても、Cappuccinoさんのおっしゃる通りなんですが…。

後は、読むのが大変で全部読んでないですが、なんかすごく無駄してるような…。
>改善できるのはクラスTileTrailerの内容だけとさせてください…

出来ない理由は何でしょう?
NullPointerExceptionの意味はわかってますでしょうか?
通常どれがnullか調べるために、複数行に分けたりするのですが。

TileTrailerのデフォルトコンストラクタで、nullになってるものをsetする。
なんか無意味な宣言してるし。

public TileTrailer(){
GameTile ownTile;
trailerPosition=NONUM;
addMouseListener(this);
}
ヒント
件の16行目をこうすれば実行できます。
stat=new JLabel(testTrailer.getPosition()+":");//+testTrailer.getGameTile().getPosition());

要するにTileTrailerの中でownTileが設定されているところが無いみたいですよ。

他にアドバイスとしては、やたらにオーバーライドされているメソッドがあるせいで、コードの見通しが悪くなっています。こういうところに投稿するなら、問題が再現する最小のコードを投稿しましょう。
public TileTrailer(GameTile tile,int position){
ownTile = tile;
trailerPosition = position;
if(tile == null){
ownTile = new GameTile();
trailerPosition=NONUM;
}
}
public TileTrailer(){
ownTile = new GameTile();
trailerPosition=NONUM;
addMouseListener(this);
}

TileTrailerのコンストラクタ二つを書き換えたら動きました。
入力と設定をクリックするとExceptionが大量に。
そうなんですか…
それでは、後は個人的に考えてみます。
コメントを書いてくださったお二方、ありがとうございましたm(_ _)m
Cappuccinoさん、檸檬さん、TDaさん>
無駄にメソッドやコンストラクタがあるのは、いくつか課題があって、例えば課題1が出来たら、次の課題2は課題1を拡張して作成しているからです。見づらくて申し訳ありません…
TDaさんのおっしゃる通り、今後は質問に関する最小のコードを書いてトピックを作成するよう気をつけます。アドバイスありがとうございます。

kawaさん>
実行してみたら、動きました。ありがとうございます。
後はboolean isRightPosition()のif文の内容を自分で考えてみます。


皆さん本当にありがとうございますorz
Cappuccinoさん>
書き込んでる間に皆様のレスがあったもので…すみません。
改善というから来てみたら、ただのデバッグだったとは・・・

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング