java - 龟兔赛跑小程序,如何才能让我的代码正常工作?

标签 java applet

我一直在研究我的项目,但很难知道我可以解决什么问题,以便让它发挥作用,我是一个初学者,只是想让你知道..

这是错误消息:

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException: String is null
    at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2817)
    at project2.project2.paint(project2.java:101)
    at sun.awt.RepaintArea.paintComponent(RepaintArea.java:264)
    at sun.awt.RepaintArea.paint(RepaintArea.java:240)
    at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:347)
    at java.awt.Component.dispatchEventImpl(Component.java:4937)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:688)
    at java.awt.EventQueue$3.run(EventQueue.java:686)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:702)
    at java.awt.EventQueue$4.run(EventQueue.java:700)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:699)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

这是我的代码:

package project2;

import java.awt.*;
import java.applet.*;

public class project2 extends Applet
{
    Image tortoise, hare;
    int tortX = 250, hareX = 250;
    final int tortY = 100, hareY = 300, WIDTH = 15, HEIGHT = 50;
    int turn; String turnNum;
    int move; String tMove, hMove;
    public void init()
    {
        tortoise = getImage( getDocumentBase(), "images/tortoise.gif" );
        hare = getImage( getDocumentBase(), "images/hare.gif" );
        move = 0; turn = 0;
    }
    public void control()
    {
        while (( tortX < 985 ) || ( hareX < 985 ))
        {
            move = (int)(10 * Math.random());
            switch (move)
            {
            case 1:
            case 2:
                tortX += (3 * WIDTH);
                hareX += (9 * WIDTH);
                tMove = "Fast Plod"; hMove = "Big Hop";
                break;
            case 3:
            case 4:
            case 5:
                tortX += (3 * WIDTH);
                hareX += WIDTH;
                tMove = "Fast Plod"; hMove = "Small Hop";
                break;
            case 6:
                tortX += WIDTH;
                if (hareX == 250) {} // Agit Nihil 
                else if (hareX <= (250 + (11 * WIDTH)))
                    hareX = 250;
                else
                    hareX -= (12 * WIDTH);
                tMove = "Slow Plod"; hMove = "Big Slip";
                break;
            case 7:
            case 8:
                tortX += (1 * WIDTH);
                if (hareX == 250) {} // Agit Nihil
                else if (hareX <= (250 + (WIDTH)))
                    hareX = 250;
                else
                    hareX -= (2 * WIDTH);
                tMove = "Slow Plod"; hMove = "Small Slip";
                break;
            case 9:
            case 10:
                if (tortX == 250) {} // Agit nihil
                else if (tortX <= (250 + (5 * WIDTH)))
                    tortX = 250;
                else
                    tortX -= (6 * WIDTH);
                tMove = "Slip"; hMove = "Fall Asleep.";
                break;
                // Cuniculus dormit, agit nihil .
            }
            turn++; turnNum = (turn + "");
            repaint();
            for (int i = 1; i <= 10; i++)
            {
                delay();
            }
        }
        tortX = 985; hareX = 985;
        repaint();
    }
    public void paint( Graphics screen )
    {
        drawRace(screen);
        if (tortX >= 985)
        {
            screen.setFont(new Font("Times New Roman", Font.ITALIC, 48));
            screen.drawString("Tortoise Wins", 650, 240);
            clearCurrent(screen);
            fillNext(screen);
        }
        else if (hareX >= 985)
        {
            screen.setFont(new Font("Times New Roman", Font.ITALIC, 48));
            screen.drawString("Tortoise Wins", 650, 240);
            clearCurrent(screen);
            fillNext(screen);
        }
        else
        {      
            screen.drawString(("Turn " + turnNum), 621, 55);
            screen.setFont(new Font("Times New Roman", Font.ITALIC, 12));
            screen.drawString(tMove, 59, 65); screen.drawString(hMove, 66, 255);
            clearCurrent(screen);
            fillNext(screen);
        }
        stop();
    }
    public void clearCurrent( Graphics s )
    {
        s.clearRect(tortX+1, tortY+1, WIDTH-1, HEIGHT-1);
        s.clearRect(hareX+1, hareY+1, WIDTH-1, HEIGHT-1);
    }
    public void fillNext( Graphics s )
    {
        s.fillRect(tortX+1, tortY+1, WIDTH-1, HEIGHT-1);
        s.fillRect(hareX+1, hareY+1, WIDTH-1, HEIGHT-1);
    }
    public void drawRace( Graphics s )
    {
        // Initium
        s.drawRect(250, 100, 750, 50);
        s.drawRect(250, 300, 750, 50);
        int lineX = 265, lineYi = 100, lineYf = 150;
        for (int i = 1; i <= 98; i++)
        {
            if (lineX == 1000)
            {
                lineX = 265; lineYi = 300; lineYf = 350;
            }
            s.drawLine(lineX, lineYi, lineX, lineYf);
            lineX += 15;
        }
        s.fillRect(tortX+1, tortY+1, WIDTH-1, HEIGHT-1);
        s.fillRect(hareX+1, hareY+1, WIDTH-1, HEIGHT-1);
        s.drawImage(tortoise, 59, 80, this);
        s.drawImage(hare, 66, 271, this);
        s.setFont(new Font("Times New Roman", Font.BOLD, 24));
        s.drawString("Race", 250, 55);
    }
    public void delay()
    {
        for (int i = 0; i < 90000000; i++)
        {
        }
    }
    public void stop()
    {
    }
}

最佳答案

看起来tMovehMove(或两者)都是null。在某些情况下,control() 中的 switch 语句似乎可以使这些未分配。要么确保 tMovehMove 在绘制屏幕之前明确分配,或者(也许更好,因为不能保证 control() 会被在绘制小程序之前调用)替换此代码:

screen.drawString(tMove, 59, 65);
screen.drawString(hMove, 66, 255);

这样:

if (tMove != null) {
    screen.drawString(tMove, 59, 65);
}
if (hMove != null) {
    screen.drawString(hMove, 66, 255);
}

关于java - 龟兔赛跑小程序,如何才能让我的代码正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19342727/

相关文章:

java - 双击 : zoom on Android MapView?

java - Jboss 为 ServletActionContext 类抛出 ClassNotFoundExpection?

Java Actionlistener 和 getSource()

java - 用于 post 请求的 java applet 和 django 服务器之间的 http 连接

Java代理小程序: is such thing possible?

Java Applet 未在 Eclipse 的内置 applet 查看器中更新

java - 哈希码的默认实现为以相同方式构造的对象返回不同的值

java - 当用户打开位置时在当前位置显示标记

java - 在html页面上调用密码学小程序

java - 社交身份验证 - 链接在 OAuth 2 中不起作用