Java NullPointerException с ArrayList

255
14 апреля 2019, 00:10

Почему выскакивает NullPointerException, если в функции stringToArray я инициализирую, передавая в качестве параметра SList

public class ListsS {
    public ArrayList<String> SList;
    public String str = "a a a";
     private void stringToArray(String string, ArrayList<String> list, String separator){
            list = new ArrayList<>(Arrays.asList(string.split(separator)));
     }
     public void a(){
            stringToArray(str,SList," ");
     }
     public void end(){
            for (String s : skillsList){
                System.out.println(s);
    }
}

Main

public class Main {
public static void main(String[] args) {
    ListS lst = new ListS();
    lst.a();
    lst.end();
}

}

Answer 1

Вы не можете переписать значение для ссылки SList таким образом:

stringToArray(str,SList," ");

В java все параметры передаются по значению. Т.е. данный код создает копию ссылки. Эта ссылка указывает на null. В методе вы изменяете ее значение. После этого она указывает на созданный список, но исходная ссылка SList осталась неизмененной

Есть несколько вариантов решения:

1) возвращать из метода ссылку на новый список и присваивать ее значение SList
2) явно в методе обращаться к полю SList
3) Передавать объект содержащий ссылку на SList например

private void stringToArray(String string, ListsS obj, String separator){
     obj.SList = new ArrayList<>(Arrays.asList(string.split(separator)));
}
Answer 2

Присвоение значения параметру list в stringToArray не меняет значение (null) члена класса SList.

 private ArrayList<String> stringToArray(String string, String separator){
   return new ArrayList<String>(Arrays.asList(string.split(separator)));
 }
 public void a(){
   SList = stringToArray(str, " ");
 }
Answer 3
ListS lst = new ListS();

вы создали новый объект с помощю конструктора по умолчанию. Все поля в нем ровно такие как описано в классе. Т.е. есть обе переменные и ArrayList и String как неинициализированные переменные типа указывают на объект null.

lst.a();

вы вызываете у этого объекта метод a(), который перепоручает работу другому методу, для работы которого требуется обе этих переменных. Обе они в этот момент указывают на null. Сплиттер не может работать с нулевой строкой. Поэтому выбрасывается исключение NullPointerException.

READ ALSO
Как поступить с файлом tomcat.xml в Gretty плагине, когда там содержится пароль от СУБД?

Как поступить с файлом tomcat.xml в Gretty плагине, когда там содержится пароль от СУБД?

Для разработки веб-приложений на Java я использую Gretty плагинЯ хочу разработать Tomcat приложение и разместить исходный код на github'e, но не понимаю...

183
Spring @Transactional и Postgresql constraint

Spring @Transactional и Postgresql constraint

Есть метод с аннотацией @Transactional:

292
NullPointerException при передаче ArrayList из сервлета в JSP

NullPointerException при передаче ArrayList из сервлета в JSP

Столкнулся с такой проблемой: передаю в JSP ArrayList из сервлета с помощью requestsetAttribute(), но при попытке получить элемент этого списка в JSP получаю...

208
Tomcat не видит драйвер JDBC MS SQL

Tomcat не видит драйвер JDBC MS SQL

В maven-проекте, запускаемом из NetBeans 82 подключена зависимость

187