【问题标题】:Java static variable persists unexpectedlyJava 静态变量意外保留
【发布时间】:2012-05-30 16:16:17
【问题描述】:

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

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

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

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

private static DateFormat df = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");

保持原样,在中午时间存储在 eventdt 列中的每个日期都将作为午夜存储在相应的 Date 变量中。显然这是不可取的,所以我试图修复它:

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 安装,重新启动,重新创建域,再次清除缓存,并进行了相同的重建/重新部署。

我也尝试更改代码本身。我想也许这可能是一个线程问题,所以我将变量更改为静态最终:

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。我在某处读过更新它也有帮助。我需要走那么远才能清除旧的静态变量吗?

我也没有尝试将代码放在同步块中或将其初始化为 ThreadSafe(尽管我什至不确定线程​​是这里的问题......)

我将不胜感激任何正确方向的指导,因为我的想法已经不多了。谢谢!

编辑:这里要求的是使用 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.");
    }

【问题讨论】:

  • 我还应该补充一点,我尝试在整个源代码中搜索可能已设置 DateFormat 的另一个位置,但没有发现任何其他出现错误格式的地方。非常感谢您的帮助!
  • 您如何检查“代码继续保留以前的格式“yyyy/MM/dd hh:mm:ss””? SimpleDateFormat 不是线程安全的see this post for example.
  • NetBeans 是问题本质上是不可能的,这甚至没有意义。另请注意,SDFs 不是线程安全的,尽管这取决于应用程序是否重要——它与您看到的问题无关。
  • @assylias 我通过调试器运行代码、使用格式化程序在代码处设置断点并检查 df 的值来检查。
  • @Caliris 正如我所说,SDF 的非线程安全性与您看到的问题无关。它是静态的几乎可以肯定是无关的。你要么没有部署你认为的代码,要么没有运行你认为的代码。

标签: java variables static


【解决方案1】:

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

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

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

【讨论】:

  • 我已经多次通过调试器运行代码,但总是出现错误的格式字符串。我只是对字符串的来源感到困惑。我反复搜索源代码以查找错误格式化程序的另一个声明,但我一直空着。这就是为什么我认为这可能与变量是静态的事实有关。
  • 你检查过重复的jar文件吗?
  • 我访问了 glassfish 管理员,那里只有一个罐子。我什至尝试手动重新部署它(而不是通过 netbeans)并遇到同样的问题。
  • 您将不得不手动查看 lib 目录以及任何有 jar 的地方。您正在更改代码但在部署时看不到它们,只有两个原因 1)该类的原始版本位于类路径中,使类加载器无法看到更改后的版本 2)您没有部署你认为你正在部署什么。
  • 我明白你的意思。我今天很早就离开办公室,但明天第一件事我会彻底查看类路径。不过我很确定你和戴夫一定有权利。
猜你喜欢
  • 1970-01-01
  • 2018-06-23
  • 2011-09-13
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多