java 中解析布尔值的奇怪行为
Strange behaviour parsing booleans in java
我正在开发我的第一个 libGDX 游戏,是一种带有桌面模拟器的放置类游戏。但我的问题一般是关于 Java。
在那个游戏中,我想先从 CSV 文件管理 GameEvents 数据 运行,然后将其作为字符串保存到 Gdx.App.Preferences,效果很好。
但没有按预期工作的是它似乎是最简单的事情,CSV 解析方法,并没有太复杂,我只是为每个 CSV 字段做一个循环并将其存储在 GameEvent 中. Class(所有原始数据类型,int、string 和 float)实际上它有效……但它说一些布尔值是假的,而实际上它们不是。
这是我的解析方法:
private void parseEventData(String data) {
String[] text = data.split(";");
int i=0;
for(String field : text) {
switch(i){
case 0:
this.id=field;
break;
case 1:
this.eventState=field;
break;
case 2:
[...]
case 8:
this.mainEvent= (Boolean.getBoolean(field));
break;
case 9:
this.active= (Boolean.getBoolean(field));
break;
case 10:
this.continueEvent= (Boolean.getBoolean(field));
break;
[...]
}
i++;
}
}
为了调试它,我包含了一对 println(),第一个打印原始“数据”,因为它带有 2 个 GameEvents 值:
1970MM01;PENDING;titlelonglonglong//subtitle//Mom//this is the maintext//is better if you could separate it in//various lines;MAIL//MAILB;1970MM02;NULL;MAIL;MAIL;true;true;true;1970;1;0.5;0.5;1;1;0;true;60
1970MM02;PENDING; childtitlewith a very very very very long title//subtitle//blah blah//booooh;MANAGER//MANAGERb//MANAGERc;NULL;NULL;MAIL;MAIL;false;true;false;1970;0;0.5;0.5;1;1;0;true;30
而另一个是在 GameEvent.class 中解析之后,只是解析而没有传递给任何其他方法...
1970MM01;PENDING;titlelonglonglong//subtitle//Mom//this is the maintext//is better if you could separate it in//various lines;MAIL//MAILB;1970MM02;NULL;MAIL;MAIL;false;false;false;1970;1.0;0.5;0.5;1.0;1.0;0.0;true;60
我已经查看了关于 Boolean.valueOf() 和 Boolean.getBoolean 的文档...但两者在某些领域都给出了一些看起来随机的值,但在其他领域效果很好...
我做错了什么?
P.S:我知道我可以使用“if”语句来解决一些问题,将 true/false 更改为 0/1,或使用 Json,但我需要知道什么我误解了像 csv 解析器这样简单的东西 T.T
你用错了方法。
使用 parseBoolean(field)
,而不是 getBoolean(field)
。
根据 documentation for getBoolean()
Returns true
if and only if the system property named by the argument exists and is equal to, ignoring case, the string "true"
. A system property is accessible through getProperty
, a method defined by the System
class.
所以除非有一个名为 "true"
的系统 属性,其值为 "True"
,这将 return false。
然而,documentation for parseBoolean()
表示:
Parses the string argument as a boolean
. The boolean returned represents the value true
if the string argument is not null and is equal, ignoring case, to the string "true"
. Otherwise, a false
value is returned, including for a null argument.
这就是你想要的。
我正在开发我的第一个 libGDX 游戏,是一种带有桌面模拟器的放置类游戏。但我的问题一般是关于 Java。
在那个游戏中,我想先从 CSV 文件管理 GameEvents 数据 运行,然后将其作为字符串保存到 Gdx.App.Preferences,效果很好。
但没有按预期工作的是它似乎是最简单的事情,CSV 解析方法,并没有太复杂,我只是为每个 CSV 字段做一个循环并将其存储在 GameEvent 中. Class(所有原始数据类型,int、string 和 float)实际上它有效……但它说一些布尔值是假的,而实际上它们不是。
这是我的解析方法:
private void parseEventData(String data) {
String[] text = data.split(";");
int i=0;
for(String field : text) {
switch(i){
case 0:
this.id=field;
break;
case 1:
this.eventState=field;
break;
case 2:
[...]
case 8:
this.mainEvent= (Boolean.getBoolean(field));
break;
case 9:
this.active= (Boolean.getBoolean(field));
break;
case 10:
this.continueEvent= (Boolean.getBoolean(field));
break;
[...]
}
i++;
}
}
为了调试它,我包含了一对 println(),第一个打印原始“数据”,因为它带有 2 个 GameEvents 值:
1970MM01;PENDING;titlelonglonglong//subtitle//Mom//this is the maintext//is better if you could separate it in//various lines;MAIL//MAILB;1970MM02;NULL;MAIL;MAIL;true;true;true;1970;1;0.5;0.5;1;1;0;true;60 1970MM02;PENDING; childtitlewith a very very very very long title//subtitle//blah blah//booooh;MANAGER//MANAGERb//MANAGERc;NULL;NULL;MAIL;MAIL;false;true;false;1970;0;0.5;0.5;1;1;0;true;30
而另一个是在 GameEvent.class 中解析之后,只是解析而没有传递给任何其他方法...
1970MM01;PENDING;titlelonglonglong//subtitle//Mom//this is the maintext//is better if you could separate it in//various lines;MAIL//MAILB;1970MM02;NULL;MAIL;MAIL;false;false;false;1970;1.0;0.5;0.5;1.0;1.0;0.0;true;60
我已经查看了关于 Boolean.valueOf() 和 Boolean.getBoolean 的文档...但两者在某些领域都给出了一些看起来随机的值,但在其他领域效果很好...
我做错了什么?
P.S:我知道我可以使用“if”语句来解决一些问题,将 true/false 更改为 0/1,或使用 Json,但我需要知道什么我误解了像 csv 解析器这样简单的东西 T.T
你用错了方法。
使用 parseBoolean(field)
,而不是 getBoolean(field)
。
根据 documentation for getBoolean()
Returns
true
if and only if the system property named by the argument exists and is equal to, ignoring case, the string"true"
. A system property is accessible throughgetProperty
, a method defined by theSystem
class.
所以除非有一个名为 "true"
的系统 属性,其值为 "True"
,这将 return false。
然而,documentation for parseBoolean()
表示:
Parses the string argument as a
boolean
. The boolean returned represents the valuetrue
if the string argument is not null and is equal, ignoring case, to the string"true"
. Otherwise, afalse
value is returned, including for a null argument.
这就是你想要的。