NullPointerException с созданием потока - PullRequest
1 голос
/ 29 марта 2012

У меня есть простое упражнение, в котором я вызываю Thread, а затем метод run ().

Однако я получаю исключение NullPointerException.

Пытается выяснить, почему существует это исключение.

package practice;
import java.util.Date;
import java.text.SimpleDateFormat;


class IdDisplay implements Runnable
{
    String idNumber;
    IdDisplay(String ID)
    {
        this.idNumber = ID;

    }
    char [] idMine = this.idNumber.toCharArray();
    public void run()
    {
        for(int i = 0; i < idMine.length; i++)
        {
            System.out.print(idMine[i] + " ");
            try
            {
                Thread.sleep(1000);
            }
            catch(InterruptedException in){}


        }
    }       
}
public class Practice
{
    public static void main(String[]args)
    {


        String name = "Arian";
        String age = "38";
        String id = "7401195021087";

        int ageInt;
        int year;
        int yearBorn;

        System.out.println("Welcome " + name + " your age is " + age + " and your ID number " + id);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        Date date = new Date();

        year = Integer.parseInt(sdf.format(date));
        ageInt = Integer.parseInt(age);
        yearBorn = year - ageInt;
        System.out.println("You were born in " + yearBorn);

        IdDisplay idClass = new IdDisplay(id);
    Thread tt = new Thread(idClass);
    tt.start(); 



    }
}   

Почему я получаю это исключение NullPointerException.

Привет

Ответы [ 7 ]

4 голосов
/ 29 марта 2012

У вас есть два объявленных поля экземпляра:

String idNumber;

и

char [] idMine = this.idNumber.toCharArray();

Инициализатор второго предполагает, что первый не null, с которого он должен начинаться, следовательно, исключение. Инициализаторы экземпляров обрабатываются до входа в конструктор.

Вместо этого переместите эту инициализацию в конструктор:

IdDisplay(String ID)
{
    this.idNumber = ID;
    this.idMine = this.idNumber.toCharArray();
}

Также настоятельно рекомендуем объявить все ваши поля в одном месте (я предпочитаю их в начале урока, но то, куда вы их кладете, является вопросом стиля; то, что вы их собираете, является более существенным соображением по обслуживанию). (Предостережение с общим правилом: в случае полей, поддерживающих методы доступа, существует аргумент для объявления поля рядом с инструментом доступа.) И некоторые вертикальные пробелы между вещами могут быть полезны.

Полный обновленный IdDisplay класс:

class IdDisplay implements Runnable
{
    String  idNumber;
    char [] idMine;

    IdDisplay(String ID)
    {
        this.idNumber = ID;
        this.idMine = this.idNumber.toCharArray();
    }

    public void run()
    {
        for(int i = 0; i < idMine.length; i++)
        {
            System.out.print(idMine[i] + " ");
            try
            {
                Thread.sleep(1000);
            }
            catch(InterruptedException in){}
        }
    }       
}
1 голос
/ 29 марта 2012

Вы создали два экземпляра, поэтому будет выдано исключение нулевого указателя.На самом деле в вашем коде переменная массива char инициализируется до того, как вы вызвали конструктор, поэтому она всегда принимает значение null.

Попробуйте ниже единицы.

class IdDisplay implements Runnable
{
    String idnumber;
    char[] idMine;
    public  IdDisplay(String ID)
    {
        idnumber=ID;
        idMine = idnumber.toCharArray();
    }

    public void run()
    {
        for(int i = 0; i < idMine.length; i++)
        {
            System.out.print(idMine[i] + " ");
            try
            {
                Thread.sleep(1000);
            }
            catch(InterruptedException in){}


        }
    }       
}
public class Practice
{
    public static void main(String[]args)
    {


        String name = "Arian";
        String age = "38";
        String id = "7401195021087";

        int ageInt;
        int year;
        int yearBorn;

        System.out.println("Welcome " + name + " your age is " + age + " and your ID number " + id);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        Date date = new Date();

        year = Integer.parseInt(sdf.format(date));
        ageInt = Integer.parseInt(age);
        yearBorn = year - ageInt;
        System.out.println("You were born in " + yearBorn);

        IdDisplay idClass = new IdDisplay(id);
        Thread tt = new Thread(idClass);
        tt.start(); 
    }
}   
1 голос
/ 29 марта 2012

Ваше исключение нулевого указателя, скорее всего, происходит из этой строки:

char [] idMine = this.idNumber.toCharArray();

Это потому, что вы инициализируете this.idNumber в конструкторе.Однако idMine будет инициализирован раньше, когда this.idNumber по-прежнему равен нулю.

1 голос
/ 29 марта 2012

переместить эту строку:

char [] idMine = this.idNumber.toCharArray();

конструктору (после установки idNumber). На своем текущем месте он инициализируется при создании экземпляра IdDisplay, а поскольку idNumber не инициализирован, вы получите исключение.

1 голос
/ 29 марта 2012
char [] idMine = this.idNumber.toCharArray();

Пытается инициализировать до

String idNumber;

И дает вам NPE.

1 голос
/ 29 марта 2012
char [] idMine = this.idNumber.toCharArray(); 

Это объявление находится в области видимости класса, и в этот момент this.idNumber является строковым объектом, который не был выделен.Вставьте его в свой метод run ().

1 голос
/ 29 марта 2012

Проблема здесь:

char [] idMine = this.idNumber.toCharArray();

Эта строка выполняется до вызова конструктора, в котором вы инициализируете this.idNumber.

Предлагаемое изменение:

String idNumber;
char [] idMine;

IdDisplay(String ID)
{
    this.idNumber = ID;
    idMine = this.idNumber.toCharArray();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...