I didn’t realize you had changed IAEs I coded to NPEs. Please change them back.

Ralph

On Apr 23, 2014, at 8:53 AM, Ralph Goers <[email protected]> wrote:

> I agree with Gary on this.
> 
> Ralph
> 
> On Apr 23, 2014, at 8:36 AM, Gary Gregory <[email protected]> wrote:
> 
>> On the call site side, it seems cleaner to catch an IAE and log the fact 
>> that some programming error took place. If I catch NPE, I cannot say that 
>> there is a bug or that someone is passing a known bad value, all I can say 
>> is that a null object is where the program does not allow it.
>> 
>> We'll have to agree to disagree.
>> 
>> Gary
>> 
>> 
>> On Wed, Apr 23, 2014 at 10:49 AM, Matt Sicker <[email protected]> wrote:
>> I used to think like that, but that was due to the fact that not a single 
>> NPE in the JDK includes an error message. Thus, NPE gets the reputation of 
>> being a completely useless exception to find in your stack track. In my 
>> opinion, IAE makes sense when the argument doesn't follow the rules other 
>> than nullity. For example, I changed the isInstanceOf method to not throw an 
>> exception if the marker doesn't exist, but if it were kept as an exception, 
>> I'd use an IAE since it indicates the given marker is not a valid argument.
>> 
>> This is pretty consistent with the JDK with the added bonus of useful 
>> exception messages.
>> 
>> 
>> On 23 April 2014 08:25, Gary Gregory <[email protected]> wrote:
>> I like IAE better than NPE because it shows log4j knows the argument is not 
>> allowed, null or otherwise, where NPE says (to me) 'some object was null and 
>> I blew up'. IAE is more of a 'this is not allowed by design, definitively 
>> not a bug in log4j'.
>> 
>> Gary
>> 
>> ---------- Forwarded message ----------
>> From: <[email protected]>
>> Date: Wed, Apr 23, 2014 at 10:20 AM
>> Subject: svn commit: r1589425 - 
>> /logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java
>> To: [email protected]
>> 
>> 
>> Author: mattsicker
>> Date: Wed Apr 23 14:20:56 2014
>> New Revision: 1589425
>> 
>> URL: http://svn.apache.org/r1589425
>> Log:
>> Update null handling.
>> 
>>   - Don't allow null Marker names. They won't work anyway due to the use of 
>> ConcurrentHashMap.
>>   - Update methods to throw NullPointerException instead of 
>> IllegalArgumentException to match updated javadocs.
>>   - Simplify equals and hashCode based on guaranteed non-nullity of marker 
>> name.
>> 
>> Modified:
>>     
>> logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java
>> 
>> Modified: 
>> logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java
>> URL: 
>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java?rev=1589425&r1=1589424&r2=1589425&view=diff
>> ==============================================================================
>> --- 
>> logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java
>>  (original)
>> +++ 
>> logging/log4j/log4j2/trunk/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java
>>  Wed Apr 23 14:20:56 2014
>> @@ -36,6 +36,7 @@ public final class MarkerManager {
>>       * Retrieve a Marker or create a Marker that has no parent.
>>       * @param name The name of the Marker.
>>       * @return The Marker with the specified name.
>> +     * @throws NullPointerException if the argument is {@code null}
>>       */
>>      public static Marker getMarker(final String name) {
>>          markerMap.putIfAbsent(name, new Log4jMarker(name));
>> @@ -48,6 +49,7 @@ public final class MarkerManager {
>>       * @param parent The name of the parent Marker.
>>       * @return The Marker with the specified name.
>>       * @throws IllegalArgumentException if the parent Marker does not exist.
>> +     * @throws NullPointerException if the argument is {@code null}
>>       * @deprecated Use the Marker add or set methods to add parent Markers. 
>> Will be removed by final GA release.
>>       */
>>      @Deprecated
>> @@ -66,6 +68,7 @@ public final class MarkerManager {
>>       * @param name The name of the Marker.
>>       * @param parent The parent Marker.
>>       * @return The Marker with the specified name.
>> +     * @throws NullPointerException if the argument is {@code null}
>>       * @deprecated Use the Marker add or set methods to add parent Markers. 
>> Will be removed by final GA release.
>>       */
>>      @Deprecated
>> @@ -83,15 +86,27 @@ public final class MarkerManager {
>>          private final String name;
>>          private volatile Marker[] parents;
>> 
>> +        /**
>> +         * Constructs a new Marker.
>> +         * @param name the name of the Marker.
>> +         * @throws NullPointerException if the argument is {@code null}
>> +         */
>>          public Log4jMarker(final String name) {
>> +            if (name == null) {
>> +                // we can't store null references in a ConcurrentHashMap as 
>> it is, not to mention that a null Marker
>> +                // name seems rather pointless. To get an "anonymous" 
>> Marker, just use an empty string.
>> +                throw new NullPointerException("Marker name cannot be 
>> null.");
>> +            }
>>              this.name = name;
>>              this.parents = null;
>>          }
>> 
>> +        // TODO: use java.util.concurrent
>> +
>>          @Override
>>          public synchronized Marker add(final Marker parent) {
>>              if (parent == null) {
>> -                throw new IllegalArgumentException("A parent marker must be 
>> specified");
>> +                throw new NullPointerException("A parent marker must be 
>> specified");
>>              }
>>              // It is not strictly necessary to copy the variable here but 
>> it should perform better than
>>              // Accessing a volatile variable multiple times.
>> @@ -100,7 +115,6 @@ public final class MarkerManager {
>>              if (localParents != null && (contains(parent, localParents) || 
>> parent.isInstanceOf(this))) {
>>                  return this;
>>              }
>> -            // FIXME: should we really be only increasing the array size by 
>> 1 each time? why not something like log(n)?
>>              final int size = localParents == null ? 1 : localParents.length 
>> + 1;
>>              final Marker[] markers = new Marker[size];
>>              if (localParents != null) {
>> @@ -113,10 +127,12 @@ public final class MarkerManager {
>>              return this;
>>          }
>> 
>> +        // TODO: add(Marker parent, Marker... moreParents)
>> +
>>          @Override
>>          public synchronized boolean remove(final Marker parent) {
>>              if (parent == null) {
>> -                throw new IllegalArgumentException("A parent marker must be 
>> specified");
>> +                throw new NullPointerException("A parent marker must be 
>> specified");
>>              }
>>              final Marker[] localParents = this.parents;
>>              if (localParents == null) {
>> @@ -184,7 +200,7 @@ public final class MarkerManager {
>>          @Override
>>          public boolean isInstanceOf(final Marker marker) {
>>              if (marker == null) {
>> -                throw new IllegalArgumentException("A marker parameter is 
>> required");
>> +                throw new NullPointerException("A marker parameter is 
>> required");
>>              }
>>              if (this == marker) {
>>                  return true;
>> @@ -213,8 +229,7 @@ public final class MarkerManager {
>>          @Override
>>          public boolean isInstanceOf(final String markerName) {
>>              if (markerName == null) {
>> -                // FIXME: and normally you'd throw an NPE here (ditto for 
>> other cases above)
>> -                throw new IllegalArgumentException("A marker name is 
>> required");
>> +                throw new NullPointerException("A marker name is required");
>>              }
>>              if (markerName.equals(this.getName())) {
>>                  return true;
>> @@ -222,8 +237,7 @@ public final class MarkerManager {
>>              // Use a real marker for child comparisons. It is faster than 
>> comparing the names.
>>              final Marker marker = markerMap.get(markerName);
>>              if (marker == null) {
>> -                // FIXME: shouldn't this just return false?
>> -                throw new IllegalArgumentException("No marker exists with 
>> the name " + markerName);
>> +                return false;
>>              }
>>              final Marker[] localParents = parents;
>>              if (localParents != null) {
>> @@ -292,19 +306,13 @@ public final class MarkerManager {
>>              if (o == null || !(o instanceof Marker)) {
>>                  return false;
>>              }
>> -
>>              final Marker marker = (Marker) o;
>> -
>> -            if (name != null ? !name.equals(marker.getName()) : 
>> marker.getName() != null) {
>> -                return false;
>> -            }
>> -
>> -            return true;
>> +            return name.equals(marker.getName());
>>          }
>> 
>>          @Override
>>          public int hashCode() {
>> -            return name != null ? name.hashCode() : 0;
>> +            return name.hashCode();
>>          }
>> 
>>          @Override
>> 
>> 
>> 
>> 
>> 
>> -- 
>> E-Mail: [email protected] | [email protected] 
>> Java Persistence with Hibernate, Second Edition
>> JUnit in Action, Second Edition
>> Spring Batch in Action
>> Blog: http://garygregory.wordpress.com 
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
>> 
>> 
>> 
>> -- 
>> Matt Sicker <[email protected]>
>> 
>> 
>> 
>> -- 
>> E-Mail: [email protected] | [email protected] 
>> Java Persistence with Hibernate, Second Edition
>> JUnit in Action, Second Edition
>> Spring Batch in Action
>> Blog: http://garygregory.wordpress.com 
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
> 

Reply via email to