所以,我有以下代码:
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()));
}
}