【问题标题】:Strange behaviour parsing booleans in javajava中的奇怪行为解析布尔值
【发布时间】:2021-12-31 05:32:00
【问题描述】:

我正在开发我的第一个 libGDX 游戏,它是一种带有桌面模拟器的空闲游戏。但我的问题是关于 Java 的。

在该游戏中,我想在第一次运行时从 CSV 文件管理 GameEvents 数据,然后将其作为字符串保存到 Gdx.App.Preferences,效果很好。

但没有按预期工作的是它似乎是最简单的事情,CSV 解析方法并没有太复杂,我只是为每个 CSV 字段做一个循环并将其存储在 GameEvent 中。类(所有原始数据类型,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(),第一个打印“data” raw,因为它带有 2 个 GameEvents 值:

1970MM01;PENDING;titlelonglonglong//副标题//妈妈//这是正文//如果你能把它分成//多行更好;MAIL//MAILB;1970MM02;NULL;MAIL;MAIL;true;真;真;1970;1;0.5;0.5;1;1;0;真;60 1970MM02;待定; 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;真;30

而这个other是在GameEvent.class中解析之后,只是解析,没有传递给任何其他方法……

1970MM01;PENDING;titlelonglonglong//副标题//妈妈//这是正文//如果你能把它分开在//各行中更好;MAIL//MAILB;1970MM02;NULL;MAIL;MAIL;false;假;假;1970;1.0;0.5;0.5;1.0;1.0;0.0;真;60

我查看了有关 Boolean.valueOf() 和 Boolean.getBoolean 的文档...但两者都在某些字段中给出了一些看起来随机的值,但在其他字段中效果很好...

我做错了什么?

PS:我知道我可以使用“if”语句来解决一些问题,并将真/假更改为 0/1,或者使用 Json,但我需要知道我在 csv 解析器这样简单的事情中误解了什么TT

【问题讨论】:

    标签: java csv libgdx boolean text-parsing


    【解决方案1】:

    你使用了错误的方法。

    使用parseBoolean(field),而不是getBoolean(field)


    根据documentation for getBoolean()

    当且仅当参数命名的系统属性存在且等于字符串"true",忽略大小写,返回true。系统属性可通过getProperty 访问,System 类定义的方法。

    所以除非有一个名为"true"的系统属性,其值为"True",否则这将返回false。

    但是,documentation for parseBoolean() 说:

    将字符串参数解析为boolean。返回的布尔值表示值 true 如果字符串参数不为 null 并且忽略大小写等于字符串 "true"。否则,将返回 false 值,包括 null 参数。

    这就是你想要的。

    【讨论】:

    • "所以除非有一个名为 "true" 的系统属性,其值为 "True",否则它将返回 false。" 哦,谢谢!我认为这应该是这么简单的事情。现在它完美运行了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 2012-06-21
    • 2013-10-29
    相关资源
    最近更新 更多