jackson-javax-json icon indicating copy to clipboard operation
jackson-javax-json copied to clipboard

NullPointerException on trying to write to JsonGenerator after close()

Open mwolson opened this issue 10 years ago • 0 comments

Version: 0.9.0 from maven JAR

It would be good to throw a more descriptive exception when someone tries to write to a JsonGenerator instance after closing it. Here's a test case:

package test.javax.json;

import com.github.pgelinas.jackson.javax.json.stream.JacksonGeneratorFactory;

import org.junit.Before;
import org.junit.Test;
import org.skyscreamer.jsonassert.JSONAssert;

import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;

import javax.json.stream.JsonGenerator;
import javax.json.stream.JsonGeneratorFactory;

public class ExploratoryTest2 {

  private JsonGeneratorFactory factory;
  private Writer writer;
  private JsonGenerator json;

  @Before
  public void setUp() {
    factory = new JacksonGeneratorFactory(new HashMap<String, Boolean>());
    writer = new StringWriter();
    json = factory.createGenerator(writer);
  }

  @Test
  public void testMultipleFactoryCalls() throws Exception {
    String expected1 =
        "[\n"
        + "  {\n"
        + "    \"trueField\":true\n"
        + "  }\n"
        + "]\n";

    json.writeStartArray()
        .writeStartObject()
        .write("trueField", true)
        .close();

    String actual1 = writer.toString();

    JSONAssert.assertEquals(expected1, actual1, true);

    String expected2 =
        "[\n"
        + "  {\n"
        + "    \"falseField\":false\n"
        + "  }\n"
        + "]\n";

    // uncomment these lines to make it pass:
    // writer = new StringWriter();
    // json = factory.createGenerator(writer);
    json.writeStartArray()
        .writeStartObject()
        .write("falseField", false)
        .close();

    String actual2 = writer.toString();

    JSONAssert.assertEquals(expected2, actual2, true);
  }
}

Current stacktrace:

java.lang.NullPointerException
    at java.lang.System.arraycopy(Native Method)
    at java.lang.String.getChars(String.java:826)
    at com.fasterxml.jackson.core.json.WriterBasedJsonGenerator.writeRaw(WriterBasedJsonGenerator.java:416)
    at com.fasterxml.jackson.core.json.WriterBasedJsonGenerator._verifyValueWrite(WriterBasedJsonGenerator.java:778)
    at com.fasterxml.jackson.core.json.WriterBasedJsonGenerator.writeStartArray(WriterBasedJsonGenerator.java:127)
    at com.github.pgelinas.jackson.javax.json.stream.JacksonGenerator.writeStartArray(JacksonGenerator.java:49)
    at co.tmol.json.ExploratoryTest2.testMultipleFactoryCalls(ExploratoryTest2.java:58)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at ...

We'd expect to see something like this instead:

throw new JsonGenerationException("attempted illegal write after close()");

mwolson avatar Mar 07 '15 01:03 mwolson