Signed-off-by: Lukas Jungmann <lukas.jungmann@oracle.com>
diff --git a/impl/src/main/java/org/glassfish/json/JsonMessages.java b/impl/src/main/java/org/glassfish/json/JsonMessages.java
index fd954ac..219b507 100644
--- a/impl/src/main/java/org/glassfish/json/JsonMessages.java
+++ b/impl/src/main/java/org/glassfish/json/JsonMessages.java
@@ -257,6 +257,10 @@
         return localize("patch.member.missing", operation, member);
     }
 
+    static String PATCH_OPERATION_MISSING() {
+        return localize("patch.operation.missing");
+    }
+
 
     private static String localize(String key, Object ... args) {
         try {
diff --git a/impl/src/main/java/org/glassfish/json/JsonPatchImpl.java b/impl/src/main/java/org/glassfish/json/JsonPatchImpl.java
index 8537477..1f9352d 100644
--- a/impl/src/main/java/org/glassfish/json/JsonPatchImpl.java
+++ b/impl/src/main/java/org/glassfish/json/JsonPatchImpl.java
@@ -150,7 +150,11 @@
 
         JsonPointer pointer = getPointer(operation, "path");
         JsonPointer from;
-        switch (Operation.fromOperationName(operation.getString("op"))) {
+        JsonString op = operation.getJsonString("op");
+        if (op == null) {
+            throw new JsonException(JsonMessages.PATCH_OPERATION_MISSING());
+        }
+        switch (Operation.fromOperationName(op.getString())) {
             case ADD:
                 return pointer.add(target, getValue(operation));
             case REPLACE:
diff --git a/impl/src/main/resources/org/glassfish/json/messages.properties b/impl/src/main/resources/org/glassfish/json/messages.properties
index aa3ad16..bcc877f 100644
--- a/impl/src/main/resources/org/glassfish/json/messages.properties
+++ b/impl/src/main/resources/org/glassfish/json/messages.properties
@@ -87,3 +87,4 @@
 patch.test.failed=The JSON Patch operation ''test'' failed for path ''{0}'' and value ''{1}''
 patch.illegal.operation=Illegal value for the op member of the JSON Patch operation: ''{0}''
 patch.member.missing=The JSON Patch operation ''{0}'' must contain a ''{1}'' member
+patch.operation.missing=The JSON Patch must contain ''op'' member
diff --git a/impl/src/test/java/org/glassfish/json/tests/JsonPatchBugsTest.java b/impl/src/test/java/org/glassfish/json/tests/JsonPatchBugsTest.java
index afe1e87..5ba3b92 100644
--- a/impl/src/test/java/org/glassfish/json/tests/JsonPatchBugsTest.java
+++ b/impl/src/test/java/org/glassfish/json/tests/JsonPatchBugsTest.java
@@ -20,6 +20,11 @@
 import jakarta.json.JsonArray;
 import jakarta.json.JsonException;
 import jakarta.json.JsonPatch;
+import jakarta.json.JsonReader;
+import jakarta.json.JsonStructure;
+
+import java.io.StringReader;
+
 import org.junit.Test;
 
 /**
@@ -42,4 +47,33 @@
                 .build();
         JsonArray result = patch.apply(array);
     }
+
+    // https://github.com/eclipse-ee4j/jsonp/issues/181
+    @Test(expected = JsonException.class)
+    public void applyThrowsJsonException2() {
+        // JSON document to be patched
+        String targetDocument
+                = "{\n"
+                + "  \"firstName\": \"John\",\n"
+                + "  \"lastName\": \"Doe\"\n"
+                + "}";
+
+        // JSON Patch document
+        // Instead of "op", we have "op_", which is invalid
+        String patchDocument
+                = "[\n"
+                + "  { \"op_\": \"replace\", \"path\": \"/firstName\", \"value\": \"Jane\" }\n"
+                + "]";
+
+        try (JsonReader objectReader = Json.createReader(new StringReader(targetDocument));
+                JsonReader arrayReader = Json.createReader(new StringReader(patchDocument))) {
+
+            JsonStructure target = objectReader.read();
+            JsonPatch patch = Json.createPatch(arrayReader.readArray());
+
+            // Applies the patch
+            // It will throw a NullPointerException with no message
+            JsonStructure patched = patch.apply(target);
+        }
+    }
 }