Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复VK_uu问题和NullPointerException?_Java_Race Condition - Fatal编程技术网

Java 如何修复VK_uu问题和NullPointerException?

Java 如何修复VK_uu问题和NullPointerException?,java,race-condition,Java,Race Condition,无论如何,它是线程“AWT-EventQueue-0”java.lang.NullPointerException中的一个异常,我想知道我是否应该得到它。它不是每次都发生,但有时会发生。如果没有,我将如何着手修复它 此外,我还使用event.VK u键来设置上、下、左、右箭头键,但它不起作用。上面写着“访问静态字段”。我该怎么办 谢谢 我会在BuffereImage中绘制背景,然后在JPanel的paintComponent中绘制BuffereImage。您可以在此处了解如何执行以下操作: 例如

无论如何,它是线程“AWT-EventQueue-0”java.lang.NullPointerException中的一个异常,我想知道我是否应该得到它。它不是每次都发生,但有时会发生。如果没有,我将如何着手修复它

此外,我还使用event.VK u键来设置上、下、左、右箭头键,但它不起作用。上面写着“访问静态字段”。我该怎么办


谢谢

我会在BuffereImage中绘制背景,然后在JPanel的paintComponent中绘制BuffereImage。您可以在此处了解如何执行以下操作:

例如,使用已创建的代码:

Graphics2D gd = bufImg.createGraphics();

我会在BuffereImage中绘制背景,然后在JPanel的paintComponent中绘制BuffereImage。您可以在此处了解如何执行以下操作:

例如,使用已创建的代码:

Graphics2D gd = bufImg.createGraphics();

你能发布完整的堆栈跟踪吗?你确定这一行有NPE吗?如果是这样的话,bufImg是空的,这只能发生在无法在ctor中创建图形上下文的情况下。@Jeremy Heiler我确实把它放在了那里,其余的都没用了。你只需要知道它是“NPE”,我想这只是因为一开始它是空的,但后来它又添加了一些东西。除了event.VK uu的东西之外,游戏运行得很好……如果你只是按照Swing graphics教程的建议,使用JPanel的paintComponent方法进行绘制,则不需要进行双缓冲扭曲。默认情况下,JComponents是双缓冲的。另外,在绘制组件中创建缓冲区并绘制缓冲区有什么好处?减慢绘制组件的速度时,将失去所有好处。我建议您阅读教程。@Jochen Bedersdorfer我的游戏运行良好,正如我上面所说。。。这只会偶尔发生一次。。。但即使在那时,游戏仍然有效。。。那么这是一个问题吗?你能发布完整的堆栈跟踪吗?你确定这一行中有NPE吗?如果是这样的话,bufImg是空的,这只能发生在无法在ctor中创建图形上下文的情况下。@Jeremy Heiler我确实把它放在了那里,其余的都没用了。你只需要知道它是“NPE”,我想这只是因为一开始它是空的,但后来它又添加了一些东西。除了event.VK uu的东西之外,游戏运行得很好……如果你只是按照Swing graphics教程的建议,使用JPanel的paintComponent方法进行绘制,则不需要进行双缓冲扭曲。默认情况下,JComponents是双缓冲的。另外,在绘制组件中创建缓冲区并绘制缓冲区有什么好处?减慢绘制组件的速度时,将失去所有好处。我建议您阅读教程。@Jochen Bedersdorfer我的游戏运行良好,正如我上面所说。。。这只会偶尔发生一次。。。但即使在那时,游戏仍然有效。。。这是个问题吗?
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class GameStartJPanel extends JPanel {
    private final static int WIDTH = 400, HEIGHT = 400;

    private final static Rectangle left = new Rectangle(0, 0, WIDTH / 10, HEIGHT);
    private final static Rectangle right = new Rectangle((WIDTH / 10) * 9, 0, WIDTH / 5, HEIGHT);
    private final static Rectangle top = new Rectangle(0, 0, WIDTH, HEIGHT / 8);
    private final static Rectangle bottom = new Rectangle(0, (HEIGHT / 15) * 14, WIDTH, HEIGHT / 9);

    private final static Rectangle topInr = new Rectangle((WIDTH / 11) * 2, (HEIGHT / 16) * 3, (WIDTH / 14) * 9,
                HEIGHT / 10);
    private final static Rectangle bottomInr = new Rectangle((WIDTH / 11) * 2, (HEIGHT / 16) * 12, (WIDTH / 14) * 9,
                HEIGHT / 10);
    private final static Rectangle leftInr = new Rectangle((WIDTH / 11) * 2, HEIGHT / 5, WIDTH / 5, (HEIGHT / 10) * 6);
    private final static Rectangle rightInr = new Rectangle((WIDTH / 12) * 6, (HEIGHT / 20) * 7, WIDTH / 2,
                (HEIGHT / 10) * 3);
    private final static Rectangle finishLine = new Rectangle(WIDTH / 10, (HEIGHT / 10) * 8, WIDTH / 10, HEIGHT / 70);

    private final static Rectangle checkPoint = new Rectangle((WIDTH / 25) * 9, (HEIGHT / 10) * 5, WIDTH / 7, HEIGHT / 70);

    private final static Rectangle carOne = new Rectangle(WIDTH / 8, HEIGHT / 2, WIDTH / 30, WIDTH / 30);
    private final static Rectangle carTwo = new Rectangle(WIDTH / 9, HEIGHT / 2, WIDTH / 30, WIDTH / 30);

    private BufferedImage backgroundImage;

    public GameStartJPanel() {
        backgroundImage = createBackgroundImage();
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
    }

    private BufferedImage createBackgroundImage() {
        BufferedImage bckgdImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics2D gd = bckgdImage.createGraphics();
        try {

            gd.clearRect(0, 0, WIDTH, HEIGHT);

            gd.setColor(Color.RED);
            gd.fillRect(finishLine.x, finishLine.y, finishLine.width, finishLine.height);

            gd.setColor(Color.LIGHT_GRAY);
            gd.fillRect(left.x, left.y, left.width, left.height);
            gd.fillRect(right.x, right.y, right.width, right.height);
            gd.fillRect(top.x, top.y, top.width, top.height);
            gd.fillRect(bottom.x, bottom.y, bottom.width, bottom.height);

            gd.fillRect(topInr.x, topInr.y, topInr.width, topInr.height);
            gd.fillRect(bottomInr.x, bottomInr.y, bottomInr.width, bottomInr.height);
            gd.fillRect(leftInr.x, leftInr.y, leftInr.width, leftInr.height);
            gd.fillRect(rightInr.x, rightInr.y, rightInr.width, rightInr.height);

            // do this in the paintComponent method
            // gd.setColor(Color.GREEN);
            // gd.draw(carOne);
            // gd.setColor(Color.PINK);
            // gd.draw(carTwo);
        } finally {
            gd.dispose();
        }

        return bckgdImage;
    }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (backgroundImage != null) {
          g.drawImage(backgroundImage, 0, 0, null);
      }

      Graphics2D g2 = (Graphics2D) g;
      g.setColor(Color.GREEN);
      g2.draw(carOne);
      g.setColor(Color.PINK);
      g2.draw(carTwo);
   }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("GameStartJPanel");
        frame.getContentPane().add(new GameStartJPanel());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }
}