我不知道我是否忘记了我的基础知识,即使我做了几年的Java工作。
我有一个具有静态块的类
static {
Properties prop = new Properties();
try {
prop.load(new FileInputStream("PATH OF PROPERTIES FILE"));
String properties22 = (String) prop.getProperty("propertyname");
properties22Tokens = new StringTokenizer(properties22, ",");
while(properties22Tokens.hasMoreTokens())
{
System.out.print(":::"+properties22Tokens.nextToken());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我已经在该变量上声明了公共静态声明,如下所示
公共静态字符串标记器属性22令牌;
我正在尝试在main方法中打印令牌,如下所示..但是没有令牌..哪个在吃代币?
public static void main(String arg[]) {
System.out.print("in main..");
while(properties22Tokens.hasMoreTokens())
{
System.out.print(":::"+properties22Tokens.nextToken());
}
}
输出是 - 来自 propeties + 的一些令牌在 main..
我的预期输出 - 属性中的一些令牌 + main.. + 属性中的一些标记
有人可以修复并解释修复吗?
是的,汤姆是对的。你在静态块中"吃掉"了它们.
以下代码段返回 false.
while(properties22Tokens.hasMoreTokens()){
.......
}
现在的问题是为什么?
因为当我们创建字符串令牌器的对象并填充它时。它将创建两个变量。一个用于 StringTokenizer 对象的令牌的总大小。第二个是检查已向您提供了多少令牌.
在 stringTokenizer 上调用 hasMoreTokens() 时,它将比较变量值并返回布尔值,它可能是真或假.
当通过stringTokenizer调用nextToken()时,它将增加变量的值,该变量是为知道提供了多少令牌而创建的。
你在静态块中"吃"了它们。到main
发生时,while(properties22Tokens.hasMoreTokens())
将是错误的。
StringTokenizer 类会断开标记中的字符串,可以使用nextToken
方法迭代标记。由于您已经使用以下循环遍历了静态块中的所有令牌:
while(properties22Tokens.hasMoreTokens())
{
System.out.print(":::"+properties22Tokens.nextToken());
}
因此,任何进一步的hasMoreTokens
电话都将返回false
.因此,main
方法中的while
循环永远不会执行。