Вопрос:

Почему Java выдает здесь исключение NullPointerException?

java exception

325 просмотра

5 ответа

29 Репутация автора

public class Test {

    public int [] x;

    public Test(int N)
    {
       int[] x = new int [N];
       for (int i=0;i<x.length;i++)
       {
           x[i]=i;
           StdOut.println(x[i]);
       }
    }


    public static void main(String[] args) { 

        String path = "/Users/alekscooper/Desktop/test.txt";
        In reader = new In(path);
        int size=reader.readInt();
        StdOut.println("Size = "+size);

        Test N = new Test(size);
        StdOut.println(N.x[3]);

    }

    /* ADD YOUR CODE HERE */

}

Привет ребята. Я изучаю Java, читая книгу Роберта Седжвика об алгоритмах, и я использую его библиотеки, например, StdOut. Но вопрос о Java в целом. Я не понимаю, почему Java здесь генерирует исключение NullPointerException. Я знаю, что это вообще означает, но я не знаю, почему это здесь, потому что вот что я делаю:

  1. прочитать целое число из файла - размер массива в классе Test. В моем тестовом примере size = 10, так что ничего особенного не происходит.

  2. распечатай это.

  3. создать объект N типа Test. В этом объекте я думаю, что я создаю массив размера, который я только что прочитал из файла. Для забавы я инициализирую его от 0 до размера 1 и печатаю. Все идет нормально.

  4. и вот где все это начинается. Так как мой класс общедоступен, и я запустил конструктор, я думаю, что у меня есть объект N, который в качестве атрибута имеет массив x с элементами размера. Однако , когда я пытаюсь обратиться к х, например,

    StdOut.println (Nx [3]);

    Java выбрасывает исключение NullPointerException.

Почему так? Пожалуйста, помогите и большое спасибо за ваше время.

Автор: alekscooper1 Источник Размещён: 01.06.2015 07:21

Ответы (5)


2 плюса

3566 Репутация автора

Внутри public Test(int n):

+ Изменить

int[] x = new int [N]; // Creating a local int array x

в

x = new int [N]; // Assigning it to x
Автор: almightyGOSU Размещён: 01.06.2015 07:25

0 плюса

117 Репутация автора

 int size=reader.readInt();  // size < 3
 StdOut.println(N.x[3]); // length of x[] less than 3, so x[3] case NullPointException
Автор: finesse Размещён: 01.06.2015 07:25

4 плюса

1223 Репутация автора

изменить первую строку в конструкторе

int[] x = new int [N];

в

x = new int [N];

он должен работать...

На самом деле в конструкторе, когда вы говорите, что int [] x, он создает еще одну локальную переменную, вместо того, чтобы установить данные в публичную переменную x ... если вы удалите int [] из первой строки конструктора, он инициирует открытую переменную, и вы сможете напечатать их в методе main ()

Автор: Pavan Kumar K Размещён: 01.06.2015 07:28

9 плюса

3899 Репутация автора

то, что вы сделали, называется слежкой за вашим полем xс локальной переменной x. так что все, что вам нужно сделать, это избежать этого:

int[] x = new int [N];неверно, если вы хотите, чтобы ваше поле инициализировалось вместо локальной переменной, вы можете сделать что-то вроде: x = new int [N];для получения дополнительной информации прочитайте это

Автор: Lrrr Размещён: 01.06.2015 07:30

2 плюса

1328 Репутация автора

Каждый дал код, который будет работать. Но причина в том, что называется переменной областью видимости. Когда вы создаете переменную (говоря int [] x, вы объявляете x как целочисленный массив, а говоря x = new int [4], вы назначаете новый массив для x). Если вы везде используете одно и то же имя переменной x и продолжаете присваивать ему разные значения, оно будет одинаковым во всем классе.

Но, если вы объявите int [] x еще раз - тогда вы создадите еще одну переменную с именем x - теперь это может привести к ошибке дублирующейся переменной или если вы объявите в более узкой «области видимости», вы будете переопределять ваше предыдущее объявление х.

Пожалуйста, ознакомьтесь с областями действия Java-переменных, чтобы понять, как работает область видимости.

Автор: Praba Размещён: 01.06.2015 07:38
Вопросы из категории :
32x32