This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-cli.git


The following commit(s) were added to refs/heads/master by this push:
     new 4e0cdd0f [CLI-344] Option.processValue() throws NullPointerException 
when passed null value with value separator configured
4e0cdd0f is described below

commit 4e0cdd0f96762df26e6335be8a1ab1afd55234f1
Author: Gary D. Gregory <[email protected]>
AuthorDate: Tue Jul 29 10:34:56 2025 -0400

    [CLI-344] Option.processValue() throws NullPointerException when passed
    null value with value separator configured
    
    Fail faster with a more precise NullPointerException
---
 src/changes/changes.xml                              | 3 ++-
 src/main/java/org/apache/commons/cli/Option.java     | 2 +-
 src/test/java/org/apache/commons/cli/OptionTest.java | 8 ++++++++
 3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 90e540bb..86c04543 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -35,7 +35,8 @@
       <action type="fix" dev="ggregory" due-to="Gary Gregory">Remove -nouses 
directive from maven-bundle-plugin. OSGi package imports now state 'uses' 
definitions for package imports, this doesn't affect JPMS (from 
org.apache.commons:commons-parent:80).</action>
       <action type="fix" dev="ggregory" due-to="Arnout Engelen">Deprecate 
PatternOptionBuilder.PatternOptionBuilder().</action>
       <action type="fix" issue="CLI-341" dev="ggregory" due-to="Ruiqi Dong, 
Gary Gregory">HelpFormatter infinite loop with 0 width input.</action>
-      <action type="fix" issue="CLI-349" dev="ggregory" due-to="Leo Fernandes, 
Gary Gregory">DefaultParser.parse() throws NullPointerException when options 
parameter is null.</action>
+      <action type="fix" issue="CLI-349" dev="ggregory" due-to="Leo Fernandes, 
Gary Gregory">Fail faster with a more precise NullPointerException: 
Option.processValue() throws NullPointerException when passed null value with 
value separator configured.</action>
+      <action type="fix" issue="CLI-344" dev="ggregory" due-to="Ruiqi Dong, 
Gary Gregory">Fail faster with a more precise NullPointerException: 
DefaultParser.parse() throws NullPointerException when options parameter is 
null.</action>
       <!-- ADD -->
       <action type="add" issue="CLI-339" dev="ggregory" due-to="Claude Warren, 
Gary Gregory">Help formatter extension in the new package #314.</action>
       <action type="add" dev="ggregory" due-to="Gary 
Gregory">CommandLine.Builder implements Supplier&lt;CommandLine&gt;.</action>
diff --git a/src/main/java/org/apache/commons/cli/Option.java 
b/src/main/java/org/apache/commons/cli/Option.java
index 253c186b..e725fa3c 100644
--- a/src/main/java/org/apache/commons/cli/Option.java
+++ b/src/main/java/org/apache/commons/cli/Option.java
@@ -830,7 +830,7 @@ public class Option implements Cloneable, Serializable {
         if (argCount == UNINITIALIZED) {
             throw new IllegalArgumentException("NO_ARGS_ALLOWED");
         }
-        String add = value;
+        String add = Objects.requireNonNull(value, "value");
         // this Option has a separator character
         if (hasValueSeparator()) {
             // get the separator character
diff --git a/src/test/java/org/apache/commons/cli/OptionTest.java 
b/src/test/java/org/apache/commons/cli/OptionTest.java
index ec0cb100..01a24ff7 100644
--- a/src/test/java/org/apache/commons/cli/OptionTest.java
+++ b/src/test/java/org/apache/commons/cli/OptionTest.java
@@ -300,6 +300,14 @@ class OptionTest {
         assertNotEquals(Option.builder("test").build().hashCode(), 
Option.builder("test").longOpt("long test").build().hashCode());
     }
 
+    @Test
+    public void testProcessValue() {
+        final Option option = new Option("D", true, "Define property");
+        option.setValueSeparator('=');
+        final NullPointerException exception = 
assertThrows(NullPointerException.class, () -> option.processValue(null));
+        assertTrue(exception.getMessage().contains("value"));
+    }
+
     @Test
     void testSerialization() throws IOException, ClassNotFoundException {
         final Option option = 
Option.builder("o").type(TypeHandlerTest.Instantiable.class).build();

Reply via email to