Hi,
On 3/11/19 5:29 PM, Joe Darcy wrote:
Hello,
Always surprising how much discussion an (apparently) simple
refactoring can generate!
Thanks to Tagir for spotting this issue.
For completeness, the two-argument forms of requireNonNull which takes
a Supplier<String> is not applicable to preserve the message behavior
since the loop counter i is not final or effectively final:
Objects.requireNonNull(defensiveCopy[i], () -> "stackTrace[" + i
+ "]");
...and even if it were effectively final, the use of that method would
not help in preventing the construction of garbage. It would just
replace one type of garbage (StringBuilder(s) and concatenated
String(s)) with another type (capturing lambda instances).
So this is best left as is.
+1
Peter
Therefore, I'll revert this use of requireNonNull in Throwable but
keep the other three:
diff -r 289fd6cb7480 src/java.base/share/classes/java/lang/Throwable.java
--- a/src/java.base/share/classes/java/lang/Throwable.java Mon Mar
11 15:34:16 2019 +0100
+++ b/src/java.base/share/classes/java/lang/Throwable.java Mon Mar
11 09:28:51 2019 -0700
@@ -914,8 +914,7 @@
for (Throwable t : suppressedExceptions) {
// Enforce constraints on suppressed exceptions in
// case of corrupt or malicious stream.
- if (t == null)
- throw new
NullPointerException(NULL_CAUSE_MESSAGE);
+ Objects.requireNonNull(t, NULL_CAUSE_MESSAGE);
if (t == this)
throw new
IllegalArgumentException(SELF_SUPPRESSION_MESSAGE);
suppressed.add(t);
@@ -942,8 +941,7 @@
stackTrace = null;
} else { // Verify stack trace elements are non-null.
for(StackTraceElement ste : stackTrace) {
- if (ste == null)
- throw new NullPointerException("null
StackTraceElement in serial stream. ");
+ Objects.requireNonNull(ste, "null
StackTraceElement in serial stream.");
}
}
} else {
@@ -1034,8 +1032,7 @@
if (exception == this)
throw new
IllegalArgumentException(SELF_SUPPRESSION_MESSAGE, exception);
- if (exception == null)
- throw new NullPointerException(NULL_CAUSE_MESSAGE);
+ Objects.requireNonNull(exception, NULL_CAUSE_MESSAGE);
if (suppressedExceptions == null) // Suppressed exceptions
not recorded
return;
Thanks,
-Joe
On 3/10/2019 4:21 AM, Remi Forax wrote:
----- Mail original -----
De: "Martin Buchholz" <marti...@google.com>
À: "Tagir Valeev" <amae...@gmail.com>
Cc: "core-libs-dev" <core-libs-dev@openjdk.java.net>
Envoyé: Vendredi 8 Mars 2019 21:35:59
Objet: Re: JDK 13 RFR of JDK-8220346: Refactor java.lang.Throwable
to use Objects.requireNonNull
On Fri, Mar 8, 2019 at 3:57 AM Tagir Valeev <amae...@gmail.com> wrote:
Hello!
diff -r 274361bd6915
src/java.base/share/classes/java/lang/Throwable.java
--- a/src/java.base/share/classes/java/lang/Throwable.java Thu Mar 07
10:22:19 2019 +0100
+++ b/src/java.base/share/classes/java/lang/Throwable.java Fri Mar 08
02:06:42 2019 -0800
@@ -874,8 +874,7 @@
// Validate argument
StackTraceElement[] defensiveCopy = stackTrace.clone();
for (int i = 0; i < defensiveCopy.length; i++) {
- if (defensiveCopy[i] == null)
- throw new NullPointerException("stackTrace[" + i
+ "]");
+ Objects.requireNonNull(defensiveCopy[i],
"stackTrace[" + i
+ "]");
Won't it produce unnecessary garbage due to string concatenation on
the common case when all frames are non-null?
I share Tagir's doubts. I avoid this construction in performance
sensitive
code.
Java doesn't offer syntactic abstraction (can I haz macros?) so the
Java
Way is to write the explicit if.
Logging frameworks have the same trouble.
https://github.com/google/flogger
No, they don't if the API use the pattern described by Peter
https://github.com/forax/beautiful_logger
Perhaps hotspot's improved automatic NPE reporting makes the message
detail
here obsolete?
anyway, i agree with what's Martin and Tagir said, requireNonNull()
should not be used in this particular case.
Rémi