diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 32a259509..d3f5b6e47 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -56,6 +56,8 @@ The <action> type attribute can be add,update,fix,remove. <action type="fix" dev="ggregory" due-to="hduelme">Improve performance of StringUtils.isMixedCase() #1096.</action> <action issue="LANG-1706" type="fix" dev="ggregory" due-to="Alberto Fernández">ThreadUtils find methods should not return null items #1098.</action> <action issue="LANG-1710" type="fix" dev="ggregory" due-to="Shashank Sharma, Gary Gregory, Oksana">ReflectionToStringBuilder changes in version 3.13.0 has broken the logic for overriding classes.</action> + <action type="fix" dev="ggregory" due-to="Gary Gregory">Return "null"" instead of NPE in ClassLoaderUtils.toString(ClassLoader).</action> + <action type="fix" dev="ggregory" due-to="Gary Gregory">Return "null"" instead of NPE in ClassLoaderUtils.toString(URLClassLoader).</action> <!-- ADD --> <action type="add" dev="ggregory" due-to="Rob Spoor, Gary Gregory">Add Functions#function(Function).</action> <action type="add" dev="ggregory" due-to="Rob Spoor, Gary Gregory">Add FailableFunction#function(FailableFunction).</action> diff --git a/src/main/java/org/apache/commons/lang3/ClassLoaderUtils.java b/src/main/java/org/apache/commons/lang3/ClassLoaderUtils.java index dda4828a2..a7cff3693 100644 --- a/src/main/java/org/apache/commons/lang3/ClassLoaderUtils.java +++ b/src/main/java/org/apache/commons/lang3/ClassLoaderUtils.java @@ -20,6 +20,7 @@ import java.net.URL; import java.net.URLClassLoader; import java.util.Arrays; +import java.util.Objects; /** * Helps work with {@link ClassLoader}. @@ -64,7 +65,7 @@ public static String toString(final ClassLoader classLoader) { if (classLoader instanceof URLClassLoader) { return toString((URLClassLoader) classLoader); } - return classLoader.toString(); + return Objects.toString(classLoader); } /** @@ -74,6 +75,6 @@ public static String toString(final ClassLoader classLoader) { * @return the formatted string. */ public static String toString(final URLClassLoader classLoader) { - return classLoader + Arrays.toString(classLoader.getURLs()); + return classLoader != null ? classLoader + Arrays.toString(classLoader.getURLs()) : "null"; } } diff --git a/src/test/java/org/apache/commons/lang3/ClassLoaderUtilsTest.java b/src/test/java/org/apache/commons/lang3/ClassLoaderUtilsTest.java index b51ed3635..157745ec2 100644 --- a/src/test/java/org/apache/commons/lang3/ClassLoaderUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/ClassLoaderUtilsTest.java @@ -17,6 +17,7 @@ package org.apache.commons.lang3; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import java.io.IOException; @@ -51,6 +52,7 @@ public void testToString_ClassLoader() throws IOException { final ClassLoader classLoader = urlClassLoader; Assertions.assertEquals(String.format("%s[%s]", classLoader, url), ClassLoaderUtils.toString(classLoader)); } + assertEquals("null", ClassLoaderUtils.toString((ClassLoader) null)); } @Test @@ -59,5 +61,6 @@ public void testToString_URLClassLoader() throws IOException { try (URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { url })) { Assertions.assertEquals(String.format("%s[%s]", urlClassLoader, url), ClassLoaderUtils.toString(urlClassLoader)); } + assertEquals("null", ClassLoaderUtils.toString((URLClassLoader) null)); } }