Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/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_Variables_Static - Fatal编程技术网

Java静态变量意外地持续存在

Java静态变量意外地持续存在,java,variables,static,Java,Variables,Static,我在调试的应用程序中遇到了一个令人沮丧的静态变量问题(我没有自己编写) 我有一个名为Transits的mysql数据库表。Transits有一个字符串列(varchar),其中保存格式为“yyyy/MM/dd HH:MM:ss”的日期(eventdt) 在对应的hibernate类中,我有一个日期变量,它将存储eventdt的值。因此,当读取eventdt时,代码将其从字符串转换为日期 代码使用SimpleDataFormat进行转换。程序员使用静态变量保存格式,但不幸的是出现了格式错误: pr

我在调试的应用程序中遇到了一个令人沮丧的静态变量问题(我没有自己编写)

我有一个名为Transits的mysql数据库表。Transits有一个字符串列(varchar),其中保存格式为“yyyy/MM/dd HH:MM:ss”的日期(eventdt)

在对应的hibernate类中,我有一个日期变量,它将存储eventdt的值。因此,当读取eventdt时,代码将其从字符串转换为日期

代码使用SimpleDataFormat进行转换。程序员使用静态变量保存格式,但不幸的是出现了格式错误:

private static DateFormat df = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
保持原样,存储在eventdt列中的中午时间的每个日期都存储在相应的日期变量中,即午夜。显然这是不可取的,因此我尝试修复它:

private static DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
但是,代码继续保留以前的格式“yyyy/MM/dd hh:MM:ss”

我已经阅读了一些关于静态变量的资料,并且尽我所能来清除它。我重新编译了代码,然后重新部署(在Glassfish 3.1.1上)。我重新启动了Netbeans(7.1.1),然后再次重建/重新部署。我清除了Netbeans缓存并重复了相同的过程。然后我删除了整个Glassfish安装,重新启动,重新创建域,再次清除缓存,并进行了相同的重建/重新部署

我还尝试更改代码本身。我想可能是线程问题,所以我将变量更改为static final:

private static final DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
然后我对其进行了更改,使静态最终变量为格式字符串,并在每个需要的方法中实例化DateFormat对象:

// In class variable block
private static final String DATETIME_FORMAT_PATTERN = "yyyy/MM/dd HH:mm:ss";

// In class methods
DateFormat df = new SimpleDateFormat(DATETIME_FORMAT_PATTERN);
无论我做了什么,都会保留相同的错误格式“yyyy/MM/dd hh:MM:ss”

我能想到的唯一一件我还没有做的事情就是删除并重新安装Netbeans。我在某个地方读到,更新它也有帮助。我需要走那么远才能清除旧的静态变量吗

我也没有尝试过将代码放入同步块或初始化为线程安全的(尽管我甚至不确定线程是这里的问题…)

我希望能得到正确方向的指导,因为我的想法已经不多了。谢谢

编辑:根据要求,这里是使用DateFormat的代码。lpr是另一个Hibernate对象,它整合了Transits表和一些其他需要的表

    Date activityDate = null;
    try {
        activityDate = df.parse(getEventdt());
        lpr.setActivityDateTime(activityDate);
    } catch (Exception e) {
        logger.warn("Unable to parse " + getEventdt() + " as a date.");
    }

NetBeans不太可能是罪魁祸首。我猜问题在于部署,很可能静态日期格式编译到的jar没有被部署

你也可以在类路径中的某个地方有一个jar,它会被拾取,而不是你更改的那个


另一种可能是,这不是负责日期的日期格式化程序。我会在线路上设置一个断点,看看你是否击中了它。如果您点击了它,它是否使用了正确的格式字符串?

NetBeans不太可能是罪魁祸首。我猜问题在于部署,很可能静态日期格式编译到的jar没有被部署

你也可以在类路径中的某个地方有一个jar,它会被拾取,而不是你更改的那个


另一种可能是,这不是负责日期的日期格式化程序。我会在线路上设置一个断点,看看你是否击中了它。如果您点击了它,它是否使用了正确的格式字符串?

我还应该补充一点,我尝试在整个源代码中搜索另一个可能设置了DateFormat的位置,但没有找到任何其他错误格式。非常感谢您的帮助!您如何检查“代码继续保留以前的格式”yyyy/MM/dd hh:MM:ss“?SimpleDataFormat不是线程安全的。NetBeans根本不可能是问题所在,这甚至没有意义。还要注意的是,
SDF
s不是线程安全的,尽管这取决于应用程序(如果这很重要)——它与您看到的问题无关。@assylias我通过调试器运行代码,使用格式化程序在代码上设置断点,并检查df的值进行了检查。@Caliris如我所说,
SDF
的非线程安全性与您看到的问题无关。它是静态的几乎可以肯定是不相关的。您可能没有部署您认为您是的代码,或者没有运行您认为您是的代码。我还应该补充一点,我尝试在整个源代码中搜索另一个可能设置了DateFormat的位置,但没有找到任何其他错误格式。非常感谢您的帮助!您如何检查“代码继续保留以前的格式”yyyy/MM/dd hh:MM:ss“?SimpleDataFormat不是线程安全的。NetBeans根本不可能是问题所在,这甚至没有意义。还要注意的是,
SDF
s不是线程安全的,尽管这取决于应用程序(如果这很重要)——它与您看到的问题无关。@assylias我通过调试器运行代码,使用格式化程序在代码上设置断点,并检查df的值进行了检查。@Caliris如我所说,
SDF
的非线程安全性与您看到的问题无关。它是静态的几乎可以肯定是不相关的。你要么没有部署你认为你是的代码,要么没有运行你认为你是的代码。我已经在调试器中运行了几次代码,但它总是出现错误的格式字符串。我只是不知道绳子是从哪里来的。我反复搜索源代码,寻找另一个错误格式化程序的声明,结果总是空的。这就是为什么我认为这可能与变量是静态的这一事实有关。你检查过重复的jar文件吗?我访问了glassfish管理员,那里只有一个jar。我甚至尝试手动(而不是通过netbeans)重新部署它,但也遇到了同样的问题