Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建java记录器时未调用构造函数_Java_Logging_Constructor - Fatal编程技术网

创建java记录器时未调用构造函数

创建java记录器时未调用构造函数,java,logging,constructor,Java,Logging,Constructor,我正在实现我的Logger类,但由于一个奇怪的原因,构造函数方法从未被调用。在另一个类中,当我使用SRCLogger.getLogger().log(Level.INFO,“Message”)路径上没有创建日志文件 我错过了什么?这个代码有什么问题 这是我的密码: public final class SRCLogger implements Serializable{ private static final Logger l = Logger.getLogger("mySRCLog

我正在实现我的Logger类,但由于一个奇怪的原因,构造函数方法从未被调用。在另一个类中,当我使用
SRCLogger.getLogger().log(Level.INFO,“Message”)路径上没有创建日志文件

我错过了什么?这个代码有什么问题

这是我的密码:

public final class SRCLogger implements Serializable{

    private static final Logger l = Logger.getLogger("mySRCLogger");
    private FileHandler fh;

    private String ROOT_DIR = "C:\\Users\\Test\\Desktop\\";

    public SRCLogger(){
        System.out.println("Constructor.");
        try {
            fh = new FileHandler(ROOT_DIR + "SRCLog.log");
            fh.setFormatter(new SimpleFormatter());
            l.addHandler(fh);
            System.out.println("Try.");
        } catch (IOException ex) {
            Logger.getLogger(SRCLogger.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Catch IOException.");
        } catch (SecurityException ex) {
            Logger.getLogger(SRCLogger.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Catch SecurityException.");
        }
    }

    public static Logger getLogger(){
        return l;
    }   
}

干杯并提前表示感谢

非常简单-您永远不会给构造函数打电话。你称之为:

public static Logger getLogger(){
    return l;
}
。。。返回
l
,一个初始化如下的静态字段:

private static final Logger l = Logger.getLogger("mySRCLogger");

为什么您希望它触发您的类被实例化?您没有任何实例方法这一事实也是一种设计味道——除了向现有记录器添加处理程序之外,您希望该类完成什么?如果这就是您想要做的,我会将您的类更改为只有一个静态方法-据我所知,您实际上不需要任何实例。

非常简单-您永远不会调用构造函数。你称之为:

public static Logger getLogger(){
    return l;
}
。。。返回
l
,一个初始化如下的静态字段:

private static final Logger l = Logger.getLogger("mySRCLogger");

为什么您希望它触发您的类被实例化?您没有任何实例方法这一事实也是一种设计味道——除了向现有记录器添加处理程序之外,您希望该类完成什么?如果这就是您想要做的,我会将您的类更改为只有一个静态方法-据我所知,您实际上不需要任何实例。

为了调用构造函数,必须使用“new”关键字实例化对象。如果只调用类(而不是对象)的静态方法,则不会调用构造函数

所以

是正在调用的静态方法

如果你这样做

   new SRCLogger().getLogger()

,则将调用构造函数,但在对象实例上调用静态方法不是一种好的做法。应该对类本身调用静态方法

为了调用构造函数,必须使用“new”关键字实例化对象。如果只调用类(而不是对象)的静态方法,则不会调用构造函数

所以

是正在调用的静态方法

如果你这样做

   new SRCLogger().getLogger()

,则将调用构造函数,但在对象实例上调用静态方法不是一种好的做法。应该对类本身调用静态方法

因此,如果我想让记录器拥有处理程序,我应该将该处理程序的代码放在静态方法中,而不是构造函数中吗?@BRabbit27:你不是在编写处理程序,你只是在创建一个
FileHandler
。将该处理程序添加到记录器的代码可以在静态方法中,是的。您应该有一个静态方法
private static init()
,它应该包含您在构造函数中执行的所有任务。如果已调用或未调用
init
,则可以保留布尔标志。在
getLogger()
中,您应该检查该标志,如果其
false
,则调用
init
,否则,如果我希望记录器具有处理程序,那么我应该将该处理程序的代码放在静态方法而不是构造函数中吗?@BRabbit27:您不是在编写处理程序-您只是在创建一个
FileHandler
。将该处理程序添加到记录器的代码可以在静态方法中,是的。您应该有一个静态方法
private static init()
,它应该包含您在构造函数中执行的所有任务。如果已调用或未调用
init
,则可以保留布尔标志。在
getLogger()
中,您应该检查该标志,如果其
false
则调用
init
,否则不要