Will do. The important thing is to add the @throws javadoc for runtime
exceptions (especially for log4j-api).


On 23 April 2014 09:59, Ralph Goers <[email protected]> wrote:

> 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<http://www.manning.com/bauer3/>
>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>> Spring Batch in Action <http://www.manning.com/templier/>
>>> 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<http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>
>
>
>


-- 
Matt Sicker <[email protected]>

Reply via email to