0

問題は、ロガーが 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();
    }
}

このエラーの正確な原因を教えてください。

4

2 に答える 2

8

問題は、これら2つの静的変数初期化子がテキスト順に実行されることです。

private final static Experience INSTANCE = new Experience(); 
public final static Logger LOGGER = Logger.getLogger(Experience.class.getName());

したがって、最初の行がコンストラクターを呼び出すと、これには次のものが含まれます。

LOGGER.addHandler(fh);

...LOGGERはまだnullです。

最も簡単な修正は、宣言の順序を逆にすることです...しかし、別のより明確な代替手段は、静的初期化子ですべてを行うことです。

private final static Experience INSTANCE;
public final static Logger LOGGER;

static {
    LOGGER = Logger.getLogger(Experience.class.getName());
    LOGGER.setLevel(Level.SEVERE);
    INSTANCE = new Experience();
}

(興味深いことに、ロガーを本当に公開したいですか?)

于 2012-08-31T21:05:04.873 に答える
0

「Experience」という名前のロガーを定義したことがないためです。getLogger(String)を呼び出すと、その名前で定義されたロガーが検索されます。Logger.getLogger(Experience.class)を実行してみてください。これにより、Experienceのロガーが取得されます。

于 2012-08-31T21:05:13.843 に答える