JAVA StringTokenizer提供随机结果

时间:2016-11-18 20:52:04

标签: java stringtokenizer

所以,我有以下代码:

StringTokenizer st = new StringTokenizer (inputString.trim(), "!=^><~", true);
log.warning(inputString.trim() + " -> " + st.countTokens()); 

我面临的问题是:对于相同的inputSring(例如字符串“@ IsForStorage @ = Y”),大多数情况下这将产生下一个输出:

@IsForStorage@=Y -> 3

但有时,这会产生这个输出:

@IsForStorage@=Y -> 2

这显然非常非常错误。

我注意到如果我在写入日志之前设置断点,我几乎每次都会得到错误的结果。我还注意到,如果我在断点处停止时在Eclipse表达式(如 st.countTokens()中进行评估,则每次评估后返回的值都会减少1(在Eclipse中,也在我的代码中),得到均匀到了我点击Run的时候我得到了输出:

@IsForStorage@=Y -> 0

如果我在代码中多次调用 countTokens(),那么该值也会减少:

StringTokenizer st = new StringTokenizer (inputString.trim(), "!=^><~", true); 
log.warning(inputString.trim() + " -> " + st.countTokens());
log.warning(inputString.trim() + " -> " + st.countTokens());
log.warning(inputString.trim() + " -> " + st.countTokens());

这有时会产生(几乎每次都在调试模式下,但也会在运行时)输出,如:

@IsForStorage@=Y -> 2
@IsForStorage@=Y -> 1
@IsForStorage@=Y -> 0

有时候输出是这样的:

@IsForStorage@=Y -> 3
@IsForStorage@=Y -> 3
@IsForStorage@=Y -> 3

任何人都可以解释为什么会发生这种情况!? 我知道StringTokenizer已被弃用,不应该使用,但我的项目中有很多旧的代码行受此影响,很难被替换。

我使用的是Java SE 8.0.91和Java SE 8.0.92。该应用程序在Payara 4服务器上运行。代码是用Eclipse MARS 2编写的。

运行我的应用程序时出现问题,但是如果我编写一个简单的独立Java应用程序并使用Eclipse调试它。

以下是一个完整说明问题的示例:

import java.util.StringTokenizer;

public class test
{
    public static void main(String[] args)
    {
        String inputString = "@IsForStorage@=Y";
        StringTokenizer st = new StringTokenizer(inputString.trim(), "!=^<~", >true);
        System.out.println(inputString + " -> " + Integer.toString(st.countTokens()));
        System.out.println(inputString + " -> " + Integer.toString(st.countTokens()));
        System.out.println(inputString + " -> " + Integer.toString(st.countTokens()));
    } 
}

0 个答案:

没有答案