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.

这就是你想要的。