Cyb*_*bex 0 java logging static
问题是Logger没有使用Logger.getLogger(class_name.class.getName())方法初始化 .你可以看到下面的代码.我标记了导致异常的行.我必须注意,我也试过没有静态setLevel块.
// File that contains logger
public class Experience {
private final static Experience INSTANCE = new Experience();
private final static Logger LOGGER = Logger.getLogger(Experience.class.getName());
private MainFrame main_frame;
static {
LOGGER.setLevel(Level.SEVERE);
}
public static Experience getInstance()
{
return INSTANCE;
}
private Experience()
{
try
{
FileHandler fh = new FileHandler(System.getProperty("user.dir") + "/log.txt");
fh.setFormatter(new XPLogFormatter());
LOGGER.addHandler(fh); // NULLPOINTEREXCEPION HERE
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
// Just a loader
public class Loader
{
public static void main(String args[])
{
JFrame.setDefaultLookAndFeelDecorated(true);
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
MainFrame main_frame = new MainFrame();
}
});
}
}
// Stripped down version of main frame
public class MainFrame extends JFrame
{
private Experience XP;
public MainFrame()
{
super();
XP = Experience.getInstance(this);
}
}
// Modified formatter
public class XPLogFormatter extends Formatter
{
@Override
public String format(LogRecord record)
{
StringBuffer buf = new StringBuffer(1000);
buf.append(formatMessage(record));
return buf.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
你能否告诉我究竟是什么导致了这个错误?
麻烦的是这两个静态变量初始值设定项以文本顺序执行:
private final static Experience INSTANCE = new Experience();
public final static Logger LOGGER = Logger.getLogger(Experience.class.getName());
Run Code Online (Sandbox Code Playgroud)
所以当第一行调用构造函数时,包括:
LOGGER.addHandler(fh);
Run Code Online (Sandbox Code Playgroud)
...... LOGGER仍然是空的.
在最简单的解决将是刚刚扭转声明的顺序......但另一个更清晰的替代方法是做这一切在静态初始化:
private final static Experience INSTANCE;
public final static Logger LOGGER;
static {
LOGGER = Logger.getLogger(Experience.class.getName());
LOGGER.setLevel(Level.SEVERE);
INSTANCE = new Experience();
}
Run Code Online (Sandbox Code Playgroud)
(出于兴趣,您真的希望记录器公开吗?)