Java - varargs вызывает исключение NullPointerException - PullRequest
0 голосов
/ 02 апреля 2012

Я просто ищу по форуму, но не нашел подобной проблемы.

Моя проблема в том, что я получаю исключение NullPointerException при использовании конструктора varargs.

Мне просто нужны были varargs водна из моих программ и попробовала это решение моей книги по Java, но оно не работает!

Мой код следующий:

/** The author list. */
private List<String> authors;

/**
 * Instantiates a new book.
 *
 * @param title the book title
 * @param year the year the book was written
 * @param authors the authors
 */
public Book(String title, int year, String... author)
{
    {...}

    if (author.length < 1)
    {
        throw new IllegalArgumentException
        ("A book needs a least 1 author!");
    }
    for (String e : author)
    {
        this.authors.add(e);
    }
}

Я думаю this.authors.add (e) вызывает исключение NullPointerException, но я не знаю, как с ним справиться.

Поскольку я тестирую его через JUnit, я просто напишу некоторые вызовы функций: (кстати, все мои вызовы функцийпровал)

Книга b1 = новая книга («Эрагон», 1990, «Эрик Картман», «Кенни»);

Книга b2 = новая книга («Эрагон», 1990, «Эрик»Картман ");

Stacktrace:

java.lang.NullPointerException
at de.imbus.training.itbbj.books.Book.<init>(Book.java:57)
at de.imbus.training.itbbj.books.BookTests.creationTestSuccessful(BookTests.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Заранее спасибо :) TLS

1 Ответ

1 голос
/ 02 апреля 2012

Нет никаких признаков того, что вы когда-либо назначали ненулевое значение для this.authors.В какой-то момент вам понадобится что-то вроде:

this.authors = new ArrayList<String>();

Или просто инициализируйте его как часть объявления:

приватный финальный список авторов = new ArrayList ();

Обратите внимание, что это полностью независимо от varargs.Вы можете жестко закодировать свои утверждения как:

this.authors.add("Foo");
this.authors.add("Bar");

, и вы получите тот же результат.

...