0
* A simple panel for testing various parts of our game.
 * This is not part of the game.  It's just for testing.
 */
package game;

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

/**
  * A simple panel for testing various parts of our game.
  * This is not part of the game.  It's just for testing.
  */
public class TestPanel extends JPanel
{
    private static final long serialVersionUID = 1L;  // Ignore this - It's just to get rid of a warning.

    // Instance variable(s).

    private Image backdrop;

    /**
     * Constructor - loads a background image
     */
    public TestPanel ()
    {
        try
        {
             ClassLoader myLoader = this.getClass().getClassLoader();
             InputStream imageStream = myLoader.getResourceAsStream("resources/path_1.jpg");
             backdrop = ImageIO.read(imageStream);

             // You will uncomment these lines when you need to read a text file.

              InputStream pointStream = myLoader.getResourceAsStream("resources/   path_1.txt");
              Scanner s = new Scanner (pointStream);
        }
        catch (IOException e)
        {
            System.out.println ("Could not load: " + e);
        }
    }

    /**
     * This paint meethod draws the background image anchored
     * in the upper-left corner of the panel.  
     */
    public void paintComponent (Graphics g)
    {
        g.drawImage(backdrop, 0, 0, null);        
    }

    /* Override the functions that report this panel's size
     * to its enclosing container. */

    public Dimension getMinimumSize()
    {
        return new Dimension (600, 600);
    }

    public Dimension getMaximumSize()
    {
        return getMinimumSize();
    }

    public Dimension getPreferredSize()
    {
        return getMinimumSize();
    }
}

このコードは、私が Java コースで取り組んでいるビデオゲームの課題を対象としています。このクラスは、コードをテストするためにのみ使用されます。割り当ての指示では、上記のように、try ブロック内に存在するコードを配置するように言われました。どうやら、コードはワークスペースのフォルダー内にある JPEG 画像を開く必要があります。ただし、コードを試すと、次のようにしか表示されません。

Exception in thread "main" java.lang.NullPointerException   at
 java.io.Reader.<init>(Unknown Source)  at
 java.io.InputStreamReader.<init>(Unknown Source)   at
 java.util.Scanner.<init>(Unknown Source)   at
 game.TestPanel.<init>(TestPanel.java:43)   at
 game.TestApplication.main(TestApplication.java:24)

inputStream と classLoaders が何をするのか完全にはわかりません。したがって、どちらかに関する基本的な情報があれば、それは素晴らしいことです。また、コンストラクター メソッドの下にある他のメソッドにはコードが含まれていないこともわかっています。私の課題の指示には、これらのメソッドに何を入力する必要があるかが記載されていません。

enter code here
enter code here
4

2 に答える 2

1

2 番目のファイル名に余分なスペースがあります。

「リソース/パス_1.txt」

明らかにそれはタイプミスです。次に、getResourceAsStreamこのストリームで呼び出すと、これらの余分なスペースのために必要なファイルが見つからないため、その呼び出しはnullポインターを返し、スキャナーに渡され、最終的にNPEを引き起こします。

于 2013-03-29T01:47:36.400 に答える
0

さまざまな状況でなぜgetResourceAsStream戻るのかを説明する既存の SO 質問がたくさんあります。null例えば

それらはすべて 1 つの根本原因に要約されます。つまり、クラス ローダーは、検索するように指示されたリソースを見つけることができません。javadoc によると、クラスローダーが要求されたリソースを見つけられない場合null、例外をスローするのではなく、返されます。

そして、それはさまざまな理由で発生する可能性があります。一般的なものには次のものがあります。

  • リソースが存在しない、
  • リソースがクラスパス上にない (たとえば、ファイル システム内のファイルである)。
  • クラスパスには存在しますが、間違ったパス文字列を使用したか、または
  • 相対パス文字列を使用しましたが、解決しようとしているコンテキストが正しくありません。
于 2013-03-29T02:27:20.417 に答える