我正在尝试将小程序嵌入到 HTML 中,以便在我的 Uni 类(class)中进行演示。每次我尝试运行执行小程序时,都会出现 NullPointerException 对话框。我做错了什么?
<html>
<head>
<title> This is my Pacman! </title>
<body bgcolor = black text= yellow>
<center>
<applet code="pacman.InitialClass.class" archive="pacSimq.jar"
width=300 height=350>
</applet>
</center>
<hr>
<a href="https://github.com/awernick/PacSim"> The repository. </a>
</body>
</html>
这是小程序的主类。该 jar 还包含多个类。
package pacman;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferStrategy;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.net.URL;
import java.util.Random;
@SuppressWarnings("serial")
public class InitialClass extends Applet implements Runnable, KeyListener {
private final int WIDTH = 224;
private final int HEIGHT = 288;
private Map map;
private Hero pacman;
private Blinky blinky;
private Graphics second;
private Image image, bg, current,current_bl, pm1, pm2, pm3, pm4, pm5, pm6, pm7, pm8, pm9,bl1,bl2,bl3,bl4,bl5,bl6,bl7,bl8;
private URL base;
private int counter;
public void init() {
setSize(WIDTH, HEIGHT);
setBackground(Color.BLACK);
setFocusable(true);
addKeyListener(this);
Frame frame = (Frame) this.getParent().getParent();
frame.setTitle("Pac-Man");
frame.setResizable(false);
try {
base = getDocumentBase();
System.out.println(base);
} catch (Exception e) {
}
pm1 = getImage(base, "data/pac_1.png");
pm2 = getImage(base, "data/pac_2.png");
pm3 = getImage(base, "data/pac_3.png");
pm4 = getImage(base, "data/pac_4.png");
pm5 = getImage(base, "data/pac_5.png");
pm6 = getImage(base, "data/pac_6.png");
pm7 = getImage(base, "data/pac_7.png");
pm8 = getImage(base, "data/pac_8.png");
pm9 = getImage(base, "data/pac_9.png");
bl1 = getImage(base, "data/bl_1.png");
bl2 = getImage(base, "data/bl_2.png");
bl3 = getImage(base, "data/bl_3.png");
bl4 = getImage(base, "data/bl_4.png");
bl5 = getImage(base, "data/bl_5.png");
bl6 = getImage(base, "data/bl_6.png");
bl7 = getImage(base, "data/bl_7.png");
bl8 = getImage(base, "data/bl_8.png");
bg = getImage(base, "data/bg1.png");
current = pm1;
current_bl = bl1;
}
@Override
public void start() {
map = new Map();
pacman = new Hero();
blinky = new Blinky(map,pacman);
Thread graphics_thread = new Thread(this);
Thread blinky_thread = new Thread(blinky);
Thread pacman_thread = new Thread(pacman);
graphics_thread.start();
blinky_thread.start();
pacman_thread.start();
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
@Override
public void run() {
while (true) {
//pacman.update();
//blinky.update(pacman.getCenterX(), pacman.getCenterY());
if (pacman.isMvRight()) {
current = pm2;
current_bl = bl2;
} else if (pacman.isMvLeft()) {
current = pm4;
current_bl = bl4;
} else if (pacman.isMvUp()) {
current = pm6;
current_bl = bl6;
} else if (pacman.isMvDown()) {
current = pm8;
current_bl = bl8;
}
repaint();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void update(Graphics g) {
if (image == null) {
image = createImage(this.getWidth(), this.getHeight());
second = image.getGraphics();
}
second.setColor(getBackground());
second.fillRect(0, 0, getWidth(), getHeight());
second.setColor(getForeground());
paint(second);
g.drawImage(image, 0, 0, this);
}
@Override
public void paint(Graphics g) {
g.drawImage(bg, 0, 0,this);
g.drawImage(current, pacman.getCenterX(), pacman.getCenterY(), this);
g.drawImage(current_bl, blinky.getCenterX(), blinky.getCenterY(), this);
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
pacman.setMvUp(true);
//System.out.println("hello");
pacman.moveUp();
//System.out.println("hello");
break;
case KeyEvent.VK_DOWN:
//System.out.println("hello");
pacman.setMvDown(true);
pacman.moveDown();
break;
case KeyEvent.VK_LEFT:
pacman.setMvLeft(true);
pacman.moveLeft();
break;
case KeyEvent.VK_RIGHT:
pacman.setMvRight(true);
pacman.moveRight();
break;
case KeyEvent.VK_SPACE:
pacman.stop();
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
这是 Java 控制台向我显示的错误。
java.lang.NullPointerException
at pacman.InitialClass.init(InitialClass.java:34)
at com.sun.deploy.uitoolkit.impl.awt.AWTAppletAdapter.init(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
我通过eclipse将其打包到jar中,但仍然得到NullPointerException。可能是什么原因造成的?
最佳答案
Frame frame = (Frame) this.getParent().getParent();
frame.setTitle("Pac-Man"); // line 34
第 34 行唯一可能为 null
的是 frame
属性。在小程序生命周期的此时,小程序显然尚未添加到根框架中。
关于Applet 上的 Java NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22951012/