运行时NullPointerException

时间:2012-11-26 20:47:08

标签: java nullpointerexception thread-sleep

运行Java代码时遇到一些错误。它编译得很好,但我得到了异常的运行时错误。这是代码:

import java.io.*;
class display {

private int charNumber;
private char[] currentArray;

public display() {

    charNumber = 0;

    }

public void dispText(String text, long speed, long wait) {
    while(currentArray[charNumber] != '~') {
        currentArray = text.toCharArray();
        System.out.print(currentArray[charNumber]);
        try {
            Thread.sleep(speed);
        } catch (NullPointerException e) {
            System.out.println("Error in the Thread process:\n" + e);
        } catch (InterruptedException e) {
            System.out.println("Error in the Thread process:\n" + e);
        }
        charNumber++;
        }
    charNumber = 0;
    try {
        Thread.sleep(wait);
    } catch (NullPointerException e) {
        System.out.println("Error in the Thread process:\n" + e);
    } catch (InterruptedException e) {
        System.out.println("Error in the Thread process:\n" + e);
    }
}

public void resetCharNumber() {
    charNumber = 0;
    }
}



class Main {
public static void main (String[] args) throws Exception {
    //Make sure to include a '~' at the end of every String.    
    String start = "Hey, is this thing on?~";
    String hello = "Hello, World!~";
    display d = new display();
    d.dispText(start, 200, 2000);
    d.dispText(hello, 200, 2000);
    System.out.println("\nDone!");
}
}

void dispText需要一个字符串来显示带有System.out.print的文本,这是一个很长的速度来确定每次显示一个字符的时间(如打字机)和漫长的等待,以确定如何在执行下一个进程之前经过了很多时间。 dispText获取String文本,将其转换为带text.toCharArray();的char数组,然后进入while循环,每次运行显示一个字符,然后等待速度指定的时间,然后继续到下一个角色。它会这样做,直到它到达最后一个字符('〜'),该字符作为字符串中最后一个字符包含在文本中。然后,它移动到下一行。然后在main中,创建显示类的istance,名为'd',d执行dispText两次。

这是我运行时遇到的运行时错误:

  

运行时错误:线程“main”中的异常java.lang.NullPointerException
  at display.dispText(Main.java:14)
  在Main.main(Main.java:48)

3 个答案:

答案 0 :(得分:4)

你宣布你的数组如下: -

private char[] currentArray;

但你从来没有初始化它。你应该在构造函数中初始化它,如: -

currentArray = new char[size];

OR,如评论中所述,您正在初始化阵列,但位置错误。

你的while循环中有这段代码: -

while(currentArray[charNumber] != '~') {
        currentArray = text.toCharArray();

将第一个语句移到while循环之外: -

currentArray = text.toCharArray();  // Move this outside the while
while(currentArray[charNumber] != '~') {

然后你不需要在构造函数中初始化数组。


作为旁注,请遵循Java命名约定。类名应以大写字母开头,之后应遵循CamelCasing。

答案 1 :(得分:1)

在使用char数组之前,你无法初始化它,而是从循环内的字符串中提取字符。 (并且你的循环索引初始化不正确)。

变化:

public void dispText(String text, long speed, long wait) {
    while(currentArray[charNumber] != '~') {
        currentArray = text.toCharArray();
        ...

public void dispText(String text, long speed, long wait) {
    currentArray = text.toCharArray();
    for(charNumber=0; currentArray[charNumber] != '~'; charNumber++) {
        ...

并从循环中删除charNumber增量。

答案 2 :(得分:0)

在尝试使用currentArray之前,尚未初始化它。

while(currentArray...