NullPointerException во время выполнения

Я получаю некоторые ошибки, когда запускаю свой 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();, а затем переходит в цикл while, где он отображает один символ за прогон, затем ждет время, указанное скоростью, а затем переходит к следующему символу. Он делает это до тех пор, пока не достигнет последнего символа ('~'), который включается как последний символ в строки, передаваемые в текст. Затем он переходит на следующую строку. Затем в main создается экземпляр класса отображения с именем 'd', и d дважды выполняет dispText.

Это ошибка времени выполнения, которую я получаю при запуске:

Ошибка выполнения: Исключение в потоке "main" java.lang.NullPointerException
в display.dispText(Main.java:14)
в Main.main(Main.java:48)


person ekrekeler    schedule 26.11.2012    source источник


Ответы (3)


Вы объявили свой массив как: -

private char[] currentArray;

Но вы никогда не инициализировали его. Вы должны инициализировать его в конструкторе, например: -

currentArray = new char[size];

ИЛИ, как указано в комментарии, вы скорее инициализируете массив, но в неправильном месте.

У вас есть этот код в цикле while: -

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

просто переместите первый оператор за пределы цикла while: -

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

И тогда вам не нужно будет инициализировать массив в конструкторе.


В качестве примечания, пожалуйста, следуйте соглашениям об именах Java. Имя класса должно начинаться с прописных букв и после этого должно следовать CamelCasing.

person Rohit Jain    schedule 26.11.2012
comment
Это исправит NPE, но без всякой причины создает массив. Почему бы просто не перенести инициализацию currentArray (currentArray = text.toCharArray()) перед циклом while? - person Simon Nickerson; 27.11.2012

Вам не удалось инициализировать массив символов перед его использованием, вместо этого извлекая символы из строки внутри цикла. (И ваш индекс цикла инициализирован неправильно).

Изменять:

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

to

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

и удалите приращение charNumber внутри цикла.

person Lawrence Dol    schedule 26.11.2012

currentArray не был инициализирован до того, как вы попытаетесь его использовать.

while(currentArray...
person David    schedule 26.11.2012