--- old/src/java.base/share/classes/java/lang/System.java 2017-03-21 12:10:45.000000000 +0000
+++ new/src/java.base/share/classes/java/lang/System.java 2017-03-21 12:10:45.000000000 +0000
@@ -1579,6 +1579,17 @@
* @return an instance of {@link Logger} that can be used by the calling
* class.
* @throws NullPointerException if {@code name} is {@code null}.
+ * @throws IllegalCallerException if there is no {@linkplain
+ * StackWalker#getCallerClass() caller} frame, i.e.
+ * when this {@code getLogger} method is called from JNI
+ * and there is no Java frame on the stack.
+ * Note: To obtain a logger in such a context, then the caller
+ * should either use an auxiliary class that will implicitly
+ * be identified as the caller, or access the system {@link
+ * LoggerFinder#getLoggerFinder() LoggerFinder} instance and
+ * obtain a logger from it. Note however that doing the latter
+ * may force the eager initialization of the underlying logging
+ * system.
*
* @since 9
*/
@@ -1586,6 +1597,9 @@
public static Logger getLogger(String name) {
Objects.requireNonNull(name);
final Class> caller = Reflection.getCallerClass();
+ if (caller == null) {
+ throw new IllegalCallerException("no caller frame");
+ }
return LazyLoggers.getLogger(name, caller.getModule());
}
@@ -1599,7 +1613,7 @@
* The returned logger will perform message localization as specified
* by {@link LoggerFinder#getLocalizedLogger(java.lang.String,
* java.util.ResourceBundle, java.lang.reflect.Module)
- * LoggerFinder.getLocalizedLogger(name, bundle, module}, where
+ * LoggerFinder.getLocalizedLogger(name, bundle, module)}, where
* {@code module} is the caller's module.
*
* @apiNote
@@ -1619,6 +1633,17 @@
* resource bundle for message localization.
* @throws NullPointerException if {@code name} is {@code null} or
* {@code bundle} is {@code null}.
+ * @throws IllegalCallerException if there is no {@linkplain
+ * StackWalker#getCallerClass() caller} frame, i.e.
+ * when this {@code getLogger} method is called from JNI
+ * and there is no Java frame on the stack.
+ * Note: To obtain a logger in such a context, then the caller
+ * should either use an auxiliary class that will implicitly
+ * be identified as the caller, or access the system {@link
+ * LoggerFinder#getLoggerFinder() LoggerFinder} instance and
+ * obtain a logger from it. Note however that doing the latter
+ * may force the eager initialization of the underlying logging
+ * system.
*
* @since 9
*/
@@ -1627,6 +1652,9 @@
final ResourceBundle rb = Objects.requireNonNull(bundle);
Objects.requireNonNull(name);
final Class> caller = Reflection.getCallerClass();
+ if (caller == null) {
+ throw new IllegalCallerException("no caller frame");
+ }
final SecurityManager sm = System.getSecurityManager();
// We don't use LazyLoggers if a resource bundle is specified.
// Bootstrap sensitive classes in the JDK do not use resource bundles