JEXL-416: fixed edge case of null pragma value;
- added unit test;
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index ef67516..5de131f 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -37,6 +37,7 @@
 
 Bugs Fixed in 3.3.1:
 ===================
+* JEXL-416:     Null-valued pragma throws NPE in 3.3
 * JEXL-415:     Incorrect template eval result
 * JEXL-414:     SoftCache may suffer from race conditions
 * JEXL-412:     Ambiguous syntax between namespace function call and map object definition.
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 48c734d..d058c06 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -42,6 +42,9 @@
                 Allow 'trailing commas' or ellipsis while defining array, map and set literals

             </action>

             <!-- FIX -->

+            <action dev="henrib" type="fix" issue="JEXL-416" due-to="William Price" >

+                Null-valued pragma throws NPE in 3.3

+            </action>

             <action dev="henrib" type="fix" issue="JEXL-415" due-to="Xu Pengcheng" >

                 Incorrect template eval result.

             </action>

diff --git a/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java b/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java
index fa5f127..5b6f114 100644
--- a/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java
+++ b/src/main/java/org/apache/commons/jexl3/parser/JexlParser.java
@@ -562,16 +562,20 @@
             }
         }
         // merge new value into a set created on the fly if key is already mapped
-        pragmas.merge(key, value, (previous, newValue)->{
-            if (previous instanceof Set<?>) {
-                ((Set<Object>) previous).add(newValue);
-                return previous;
-            }
-            final Set<Object> values = new LinkedHashSet<>();
-            values.add(previous);
-            values.add(newValue);
-            return values;
-        });
+        if (value == null) {
+            pragmas.putIfAbsent(key, null);
+        } else {
+            pragmas.merge(key, value, (previous, newValue) -> {
+                if (previous instanceof Set<?>) {
+                    ((Set<Object>) previous).add(newValue);
+                    return previous;
+                }
+                final Set<Object> values = new LinkedHashSet<>();
+                values.add(previous);
+                values.add(newValue);
+                return values;
+            });
+        }
     }
 
     /**
diff --git a/src/test/java/org/apache/commons/jexl3/PragmaTest.java b/src/test/java/org/apache/commons/jexl3/PragmaTest.java
index a80ed53..95ba906 100644
--- a/src/test/java/org/apache/commons/jexl3/PragmaTest.java
+++ b/src/test/java/org/apache/commons/jexl3/PragmaTest.java
@@ -376,4 +376,13 @@
         final Object result = script.execute(jc);
         Assert.assertEquals(42, result);
     }
+
+    @Test
+    public void testIssue416() {
+        final JexlEngine jexl = new JexlBuilder().create();
+        JexlScript script = jexl.createScript("#pragma myNull null\n");
+        Map<String, Object> pragmas = script.getPragmas();
+        Assert.assertTrue("pragma key present?", pragmas.containsKey("myNull"));
+        Assert.assertNull("expected null value", pragmas.get("myNull"));
+    }
 }