2012-05-03 11 views
-1

まず、この質問は約15パズルです。そして、私はそれをJava言語でコード化する方法を学びたいと考えています。スレッド "main"の例外java.lang.NullPointerException(15-Puzzle)

IDA *アルゴリズムについて私の大学で人工知能を学ぶ必要があり、Brian Borowski:http://brian-borowski.com/Software/Puzzle/によってこのリンクが見つかりました。それはかなり良いリンクでしたが、手動で構築しようとしたときにエラーが発生しました。私のEclipse上で。

誰も私を助けることができますか?

Exception in thread "main" java.lang.NullPointerException 
    at Puzzle.setNumOfTiles(Puzzle.java:45) 
    at Puzzle.<init>(Puzzle.java:25) 
    at GUI.<init>(GUI.java:196) 
    at Application.<init>(Application.java:19) 
    at Application.main(Application.java:27) 

私はすでに検索グーグル、エラーをトレースしようとしたが、それでも私は解決策を見つけることができません:私は言うエラーが発生しました。 NullPointerExceptionは、いくつかの変数がnull値を持つ場合に発生します。 誰でも私をここで助けることができますか?ここ

ソースコードは

Application.javaある

public class Application { 

    /** 
    * Default constructor. 
    * Creates an instance of the gui. 
    */ 
    public Application() { 
     ApplicationStarter appStarter = null; 
     new GUI(appStarter); // Line 19 
    } 

    /** 
    * Main method. 
    * Creates an instance of the application. 
    */ 
    public static void main(final String[] args) { 
     new Application(); // Line 27 
    } 
} 

Puzzle.java

public Puzzle(final int numOfTiles) { 
    super(); 
    setNumOfTiles(numOfTiles); // Line 25 
    setSize(panelWidth, panelHeight); 
    setDoubleBuffered(true); 
} 

public void setNumOfTiles(final int numOfTiles) { 
    this.numOfTiles = numOfTiles; 
    dimension = (int)Math.sqrt(numOfTiles); 
    imageArray = new Image[numOfTiles]; 
    final String file = "images/" + (numOfTiles - 1) + "-puzzle/shrksign_"; 
    imageArray[0] = null; 
    for (int i = 1; i < numOfTiles; ++i) { 
     final StringBuilder builder = new StringBuilder(file); 
     if (i <= 9) { 
      builder.append("0"); 
     } 
     builder.append(Integer.toString(i)); 
     builder.append(".gif"); 
     imageArray[i] = ImagePanel.getImage(builder.toString()); 
    } 
    imageWidth = imageArray[1].getWidth(null); // Line 45 
    imageHeight = imageArray[1].getHeight(null); 
    panelWidth = imageWidth * dimension; 
    panelHeight = imageHeight * dimension; 
    state = new byte[numOfTiles]; 
    sleepMs = 500/imageWidth; 
    animationDone = true; 
    resetOrder(); 
} 

GUI.java

... 

this.puzzle = new Puzzle(PuzzleConfiguration.getNumOfTiles()); 

... 
+1

Puzzle.javaの45行目はどれですか?ヌルとは何で、この行にはいけないのですか?デバッガでコードを実行するとどうなりますか? –

+2

45行目で何が起こるのかデバッグしましたか?そこには何があり、なぜですか? ImagePanel.getImage(...)がイメージを見つけず、その場合nullを返す可能性がありますか? ... – Thomas

+0

'PuzzleConfiguration.getNumOfTiles()'の値は何ですか?あなたは喜んで、あなたのGIFが存在し、彼らは正しい名前を持っていますか? – Matzi

答えて

0

あなたは例外の意味について完全に正しいです:

それはいくつかの変数がNULL値を持っているときにNullPointerExceptionが起こることを言いました。あなたがする必要がどのような

は、(全体のソースファイルの、ではない方法で)45、具体的ライン、setNumOfTiles方法を見て、そこに何が起こるか見ています。

おそらく、初期化されていない変数またはを引数として渡している可能性があります。

幸運。

0

明らかに、imageArray[1]はヌル値を保持しています。要素1にはImagePanel.getImage()が返されます。ループが実行されないようにnumOfTiles> = 1になります。

あなたのループはiとpreincrementsで始まります。つまり、i = 1(最初の繰り返しはi = 2で実行)でループが実行されていないことを意味します。私はこのフォームを使用します

for (int i = 1; i <= numOfTiles; i++) { 

EDIT:

トーマスは右です。そのようにnumOfTilesが小さすぎる(1以下)か、ImagePanel.getImageがnullを返します(リソースファイルがありませんか?)

+0

実際、そうではありません。 'i = 1'の反復があります。事前インクリメントはインクリメント操作がイテレーションの後に呼び出されるので、ここではロジックを変更しない(したがって、最初の反復ではiは依然として値1を持つ)。 – Thomas

0

あなたがnullの配列が

imageArray = new Image[numOfTiles]; 

が続いてループ

imageArray[i] = ImagePanel.getImage(builder.toString()); 

のためにその値を通じ設定が、設定された値がnullであり、あなたが方法をCALしようとすると、値が初期化されていますヌル値からこの行にNULLPOINTEREXCEPTIONを取得します。

imageWidth = imageArray[1].getWidth(null); 

imageArray [1] conヌル値を返す。呼び出し。 on null常にcaz NULLPOINTEREXCEPTION

関連する問題