# HG changeset patch # User darcy # Date 1255995108 25200 # Node ID 35a627ad24436a869829bdfa36bc86ba8d28a2d9 # Parent 3d03789e9478947562f0af099eccf3c98c7b1017 6889858: Add nonNull methods to java.util.Objects Reviewed-by: darcy Contributed-by: jjb@google.com diff -r 3d03789e9478 -r 35a627ad2443 jdk/src/share/classes/java/util/Objects.java --- a/jdk/src/share/classes/java/util/Objects.java Mon Oct 19 13:43:25 2009 -0700 +++ b/jdk/src/share/classes/java/util/Objects.java Mon Oct 19 16:31:48 2009 -0700 @@ -107,4 +107,50 @@ public static int compare(T a, T b, Comparator c) { return (a == b) ? 0 : c.compare(a, b); } + + /** + * Checks that the specified object reference is not {@code null}. This + * method is designed primarily for doing parameter validation in methods + * and constructors, as demonstrated below: + *
+     * public Foo(Bar bar) {
+     *     this.bar = Objects.nonNull(bar);
+     * }
+     * 
+ * + * @param obj the object reference to check for nullity + * @param the type of the reference + * @return {@code obj} if not {@code null} + * @throws NullPointerException if {@code obj} is {@code null} + */ + public static T nonNull(T obj) { + if (obj == null) + throw new NullPointerException(); + return obj; + } + + /** + * Checks that the specified object reference is not {@code null} and + * throws a customized {@link NullPointerException} if it is. This method + * is designed primarily for doing parameter validation in methods and + * constructors with multiple parameters, as demonstrated below: + *
+     * public Foo(Bar bar, Baz baz) {
+     *     this.bar = Objects.nonNull(bar, "bar must not be null");
+     *     this.baz = Objects.nonNull(baz, "baz must not be null");
+     * }
+     * 
+ * + * @param obj the object reference to check for nullity + * @param message detail message to be used in the event that a {@code + * NullPointerException} is thrown + * @param the type of the reference + * @return {@code obj} if not {@code null} + * @throws NullPointerException if {@code obj} is {@code null} + */ + public static T nonNull(T obj, String message) { + if (obj == null) + throw new NullPointerException(message); + return obj; + } } diff -r 3d03789e9478 -r 35a627ad2443 jdk/test/java/util/Objects/BasicObjectsTest.java --- a/jdk/test/java/util/Objects/BasicObjectsTest.java Mon Oct 19 13:43:25 2009 -0700 +++ b/jdk/test/java/util/Objects/BasicObjectsTest.java Mon Oct 19 16:31:48 2009 -0700 @@ -37,6 +37,7 @@ errors += testHashCode(); errors += testToString(); errors += testCompare(); + errors += testNonNull(); if (errors > 0 ) throw new RuntimeException(); } @@ -102,4 +103,53 @@ } return errors; } + + private static int testNonNull() { + int errors = 0; + String s; + + // Test 1-arg variant + try { + s = Objects.nonNull("pants"); + if (s != "pants") { + System.err.printf("1-arg non-null failed to return its arg"); + errors++; + } + } catch (NullPointerException e) { + System.err.printf("1-arg nonNull threw unexpected NPE"); + errors++; + } + + try { + s = Objects.nonNull(null); + System.err.printf("1-arg nonNull failed to throw NPE"); + errors++; + } catch (NullPointerException e) { + // Expected + } + + // Test 2-arg variant + try { + s = Objects.nonNull("pants", "trousers"); + if (s != "pants") { + System.err.printf("2-arg nonNull failed to return its arg"); + errors++; + } + } catch (NullPointerException e) { + System.err.printf("2-arg nonNull threw unexpected NPE"); + errors++; + } + + try { + s = Objects.nonNull(null, "pantaloons"); + System.err.printf("2-arg nonNull failed to throw NPE"); + errors++; + } catch (NullPointerException e) { + if (e.getMessage() != "pantaloons") { + System.err.printf("2-arg nonNull threw NPE w/ bad detail msg"); + errors++; + } + } + return errors; + } }