Пожалуйста, помогите мне «Исключение Java в потоке основной java.lang.nullpointerexception»

1

Я хотел бы обратиться за помощью к моему проекту. Я программист новичков, и я не получаю эту ошибку "exception in thread main java.lang.nullpointerexception"

это мой код:

 public class Slumbook{

    public String codeName;

    public Slumbook(){
        //
    }

    public Slumbook(String codeName){
        this.codeName = codeName;
    }

    public String getCodeName(){return codeName;}

    public void setCodeName(String codeName){this.codeName = codeName;}
   }

И код Driver Program: -

import java.util.*;

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

        Scanner sc = new Scanner(System.in);
        Slumbook[] slum = new Slumbook[20];

        for(int n=0; n<10; n++){
            slum[n].setCodeName(sc.nextLine());
        }
    }
}
  • 2
    Вы создаете массив, но никогда не инициализируете каждый слот массива. Вы должны посмотреть, что такое NullPointerException , потому что этот вопрос задают ВСЕ ВРЕМЯ.
  • 1
    К тому времени, как вы попадете в цикл, slum[n] еще не было создано; то есть это нулевая ссылка / указатель. Чтобы исправить это, создайте экземпляр каждого элемента в slum прежде чем пытаться установить его кодовое имя.
Теги:

3 ответа

0
Лучший ответ

Перед использованием необходимо инициализировать элементы массива.

Slumbook[] slum = new Slumbook[20];

for(int n=0; n<10; n++){
    slum[n] = new Slumbook();
    slum[n].setCodeName(sc.nextLine());
}

Вы можете инициализировать все элементы массива сразу, чтобы избежать любых будущих Исключений

Slumbook[] slum = new Slumbook[20];

for(int i = 0 ; i < slum.length ; i++)  //initializing all the elements
    slum[i] = new Slumbook();

for(int n=0; n<10; n++){
    slum[n].setCodeName(sc.nextLine());
}
  • 0
    Я думаю, что это более накладно, чтобы иметь два цикла for, и вы можете объяснить, какое будущее исключение придет?
2

Вы выделили массив... но вам не удалось выделить какие-либо объекты, содержащиеся в массиве.

ПРЕДЛОЖЕНИЕ:

import java.util.*;

public class SlumbookD { 

    public static void main(String[] args){
      Scanner sc = new Scanner(System.in);
      Slumbook[] slum = new Slumbook[20];
      for(int n=0; n<slum.length; n++){
          slum[n] = new Slumbook(sc.nextLine);
      }
    }

}

... ИЛИ ЛУЧШЕ...

// You only need one class - with it own main().  Not two classes...
public class Slumbook{

  public String codeName;

  public Slumbook(String codeName){
    this.codeName = codeName;
  }

  public String getCodeName(){
    return codeName;
  }

  public void setCodeName(String codeName){
    this.codeName = codeName;
  }

  public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    Slumbook[] slum = new Slumbook[20];
    for(int n=0; n<slum.length; n++){
        slum[n] = new Slumbook(sc.nextLine);
    }
  }

}

  • 0
    Типа медленно ... слишком много опечаток.
  • 0
    @ ambigram_maker: потому что ОП назвал свой «класс водителя» SlumbookD.
Показать ещё 2 комментария
1

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

 Slumbook[] slum = new Slumbook[20];

    for(int n=0; n<10; n++){
        slum[n] = new Slumbook(); //  Instantiate Slumbook class and assign reference
        slum[n].setCodeName(sc.nextLine());
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню