Исключение нулевого указателя при тестировании в Java

public boolean isItMyName(String name)
    {    
       name = fullname.substring(0,fullname.indexOf(' '));
       ...
    }

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

Я также создал тестер JUnit, где он проверяет, является ли ввод истинным или ложным.

Name myName = new Name();
assertEquals(false, myName.isItMyName("Troll");

Это также дает мне исключение нулевого указателя в assertEquals(false, myName.isItMyName("Troll"));

Я в своем уме. Как я могу это исправить?

@ Грег Хьюгилл:

В моем классе Name я делаю это:

public class Name(String n)
{
  name = n;
}

Но в моем основном методе я передаю строку: Name myName = new Name("Johnathy");

Таким образом, строка не является нулевой.

ФИО:

public class EmailAddress {
private String address;



public EmailAddress(String a)
{
  address = a;

}

public String toString()
{
    return address;
}

person Macosx Iam    schedule 15.10.2011    source источник
comment
Каково значение полного имени переменной/поля? Может он нулевой?   -  person pholser    schedule 16.10.2011
comment
Что ж, похоже, что переменная fullname, которую вы используете в этой строке, равна нулю. Итак, вопрос: где вы инициализируете эту переменную чем-то другим, кроме значения по умолчанию, равного нулю?   -  person Darin Dimitrov    schedule 16.10.2011
comment
Вы уверены, что fullname не null?   -  person Danilo Piazzalunga    schedule 16.10.2011
comment
@MacosxIam: Вы понимаете, что объект, который вы создаете в методе main, это не тот же объект, который вы создаете в своем модульном тесте?   -  person Jon Skeet    schedule 16.10.2011
comment
Теперь вы значительно изменили свой вопрос, вызвав два разных конструктора Name в разных ситуациях и введя код для EmailAddress, который кажется несвязанным. Боюсь, я потерялся сейчас.   -  person Greg Hewgill    schedule 16.10.2011


Ответы (4)


Что ж, вы игнорируете свой параметр... вы присваиваете новое значение name в первой строке. Это означает, что ваш метод почти наверняка сломан с самого начала.

Затем подумайте, откуда возьмется fullname (которое, как я предполагаю, является переменной экземпляра). Если вы не установите для него значение в своем конструкторе без параметров, по умолчанию оно будет null. Это действительно то, чего вы хотите?

Я предлагаю вам изменить класс Name на только конструкторы, принимающие параметры имени, и убедиться, что они не пустые. Таким образом, у вас никогда не будет недопустимого объекта Name, полное имя которого null.

РЕДАКТИРОВАТЬ: теперь вы разместили больше кода, посмотрите на свой конструктор без параметров и метод setName:

public Name()
{
   setName(fullname);     
}

public void setName(String n)
{
    fullname = n;
}

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

public Name()
{
   fullname = fullname;
}

... то есть без операции. fullname будет нулевым, отсюда и исключение.

Мой совет — полностью избавиться от конструктора без параметров и заставить другой проверять параметр.

person Jon Skeet    schedule 15.10.2011
comment
Но разве я не просто определяю, что такое имя? Это то, что я хочу сделать. - person Macosx Iam; 16.10.2011
comment
@MacosxIam: Нет, вы уже объявили name в качестве параметра метода. Таким образом, перед выполнением первой строки метода значение name будет ссылкой на Troll. Затем вы пытаетесь установить другое значение (подстроку fullName). Возможно, стоит просмотреть параметры в любой книге/учебнике, по которым вы учитесь, даже до того, как вы решите проблему с нулевой ссылкой. - person Jon Skeet; 16.10.2011
comment
Я удалил параметр и создал строку с этими инструкциями (подстрока). Все еще исключение нулевого указателя. Это означает, что параметры не имеют НИЧЕГО общего с ошибкой. - person Macosx Iam; 16.10.2011
comment
@MacosxIam: Нет, они не связаны с ошибкой - это связано с fullname, о чем остальная часть моего ответа. Но жизненно важно, чтобы вы также понимали проблему параметров. - person Jon Skeet; 16.10.2011
comment
@MacosxIam: отредактировано с более подробной информацией о том, что происходит в вашем текущем коде. - person Jon Skeet; 16.10.2011
comment
@MacosxIam: если вы удалили конструктор без параметров, то, вероятно, вы изменили тестовый код (поскольку он вызывал конструктор без параметров). Пожалуйста, обновите свой пост с новым тестовым кодом. - person Jon Skeet; 16.10.2011

   name = fullname.substring(0,fullname.indexOf(' '));

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

person Greg Hewgill    schedule 15.10.2011
comment
@MacosxIam: Да, но строка может быть null, особенно если вы ей ничего не присвоили. Из кода, который вы разместили, похоже, что вам еще предстоит попрактиковаться. Удачи, используйте отладчик и продолжайте задавать вопросы! - person Greg Hewgill; 16.10.2011
comment
Нит: String не может быть нулевым... оценка выражения типа String может привести к нулевому значению, но +1 все равно. Гравитация существует. ;-) - person ; 16.10.2011
comment
@MacosxIam: Это не то, что вы показали в своем исходном вопросе, где ваш тестер JUnit делает Name myName = new Name(); (используя конструктор без параметров). Конструктор без параметров принимает значение fullname (которое равно null, потому что с него начинается), вызывает setName(null), которое присваивает fullname = null. В этом случае это окольный способ ничего не делать. Возможно, вы могли бы сделать fullname = "" в своем конструкторе без параметров, чтобы fullname начиналось как пустая строка, а не null. - person Greg Hewgill; 16.10.2011

Без дополнительного кода я не могу сказать наверняка, но могу поспорить, что fullname имеет значение null и никогда ничего не устанавливает.

person corsiKa    schedule 15.10.2011

если в полном имени не найден индекс ' ', он не вернет -1, что приведет к захвату подстроки 0, -1, которая равна нулю... возможно, бросьте ее в if и пропустите этот шаг, если индекс ‹ 0... и не должен ли ваш входящий параметр быть полным именем

person fjlj    schedule 15.10.2011
comment
Фактически, в этом случае substring() выдаст StringIndexOutOfBoundsException. Вы бы не увидели NPE. - person Ryan Stewart; 16.10.2011