【问题标题】:Android: Ints.tryParse returns always "null", even if there's a number in the StringAndroid:Ints.tryParse 总是返回“null”,即使字符串中有一个数字
【发布时间】:2012-12-01 16:27:58
【问题描述】:

我用谷歌搜索了我的问题,并在 stackoverflow 上搜索了解决方案,但我找不到我的问题的解决方案。我正在尝试实现一个函数来检查 ANDROID_ID 是否已保存在 Apps 数据库中,或者是否没有。如果设备的 ANDROID_ID 为空,它会创建一个随机 UUID,然后将其保存在数据库中。我的问题是,每次我尝试使用“Ints.tryParse”解析字符串中的数字时,它都会返回 null,然后应用程序崩溃。我已经在两个 Galaxy S2 上试用过该应用程序。它在其中一个上崩溃,但在另一个上工作(一个使用 Android 4.1.2 CyanogenMod,一个使用 Stock 4.0)。它也会在模拟器中崩溃。顺便说一句,我将 Google Guava 库用于“Ints.tryParse”。

代码如下:

    UUID uuid;
    int finalresult = 0;
    String android_id = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
    Log.v(TAG, "Android ID: " + android_id);
    String androidid = CharMatcher.DIGIT.retainFrom(android_id);
    Log.v(TAG, "Int0: " + androidid);
    Integer on2 = Ints.tryParse(androidid);
    if(on2 != null) {
        if(DEBUG_STATUS == 1) {
            Log.v(TAG, "Integer is: " + Integer.toString(on2));
        }
        int times = 3;
        finalresult = on2*times;
        if(DEBUG_STATUS == 1) {
            Log.v(TAG, "Result: " + Integer.toString(finalresult));
            Log.v(TAG, "Device ID: " + android_id + Integer.toString(finalresult));
        }
    }
    else
    {   
        uuid = UUID.randomUUID();
        String uuuid = CharMatcher.DIGIT.retainFrom(uuid.toString());
        Integer randomuuid = Ints.tryParse(uuuid);

        if(randomuuid == null) {
            Log.v(TAG, "Was null again...");
        }
        if(DEBUG_STATUS == 1) {
            Log.v(TAG, "Integer null!");
            Log.v(TAG, uuuid);
            Log.v(TAG, "UUID: " + randomuuid.toString());
        }
        int times = 3;
        finalresult = randomuuid.intValue()*times;
    }

这是来自模拟器 (Android 2.3.3) 的 LogCat:

> 12-01 16:14:22.505: V/******(410): Android ID: ea58466ebe002707 

> 12-01 16:14:51.845:V/******(410): Int0: 58466002707

> 12-01 16:14:51.865: V/******(410): Was null again...

> 12-01 16:14:51.875: V/******(410): Integer null!

> 12-01 16:14:51.875: V/******(410): 801094028350597

> 12-01 16:14:51.925: E/AndroidRuntime(410): FATAL EXCEPTION: main
> 12-01 16:14:51.925: E/AndroidRuntime(410): java.lang.RuntimeException:Unable to start activity ComponentInfo{*****/******}:
> .lang.NullPointerException 12-01 16:14:51.925:
> E/AndroidRuntime(410):    at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
> 12-01 16:14:51.925: E/AndroidRuntime(410):    at
> android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
> 12-01 16:14:51.925: E/AndroidRuntime(410):    at
> android.app.ActivityThread.access$1500(ActivityThread.java:117) 12-01
> 16:14:51.925: E/AndroidRuntime(410):  at
> android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
> 12-01 16:14:51.925: E/AndroidRuntime(410):    at
> android.os.Handler.dispatchMessage(Handler.java:99) 12-01
> 16:14:51.925: E/AndroidRuntime(410):  at
> android.os.Looper.loop(Looper.java:123) 12-01 16:14:51.925:
> E/AndroidRuntime(410):    at
> android.app.ActivityThread.main(ActivityThread.java:3683) 12-01
>  16:14:51.925: E/AndroidRuntime(410):     at
> java.lang.reflect.Method.invokeNative(Native Method) 12-01
> 16:14:51.925: E/AndroidRuntime(410):  at
> java.lang.reflect.Method.invoke(Method.java:507) 12-01 16:14:51.925:
> E/AndroidRuntime(410):    at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
> 12-01 16:14:51.925: E/AndroidRuntime(410):    at
> com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 12-01
> 16:14:51.925: E/AndroidRuntime(410):  at
> dalvik.system.NativeStart.main(Native Method) 12-01 16:14:51.925:
> E/AndroidRuntime(410): Caused by: java.lang.NullPointerException 12-01
> 16:14:51.925: E/AndroidRuntime(410):  at
> com.actionbarsherlock.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java:526)
> 12-01 16:14:51.925: E/AndroidRuntime(410):    at
> com.actionbarsherlock.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:452)
> 12-01 16:14:51.925: E/AndroidRuntime(410):    at
> com.actionbarsherlock.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:438)
> 12-01 16:14:51.925: E/AndroidRuntime(410):    at
> android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
> 12-01 16:14:51.925: E/AndroidRuntime(410):    at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
> 12-01 16:14:51.925: E/AndroidRuntime(410):    ... 11 more

老实说,我不知道出了什么问题...如您所见,字符串不是空的,它实际上显示了来自设备的 ANDROID_ID。

如果您需要更多信息,请告诉我您需要什么,然后我会编辑帖子。

【问题讨论】:

  • "Ints.tryParse 总是返回“null”,即使字符串中有一个数字" 请举个例子。你为 tryParse() 使用了什么库?我使用的 tryParse 实现仅在字符串为数字时返回整数结果,例如“A123”->null。
  • 我确实在谷歌上搜索了为什么会发生这个问题,唯一的答案与他们试图解析的字符串中没有任何内容的人有关,而我确实有一个带有 ANDROID_ID 数字的字符串在其中,我知道字符串不为空(请参阅 LogCat:Android ID 和 Int0)。对不起,我忘了把它写下来。我正在使用谷歌番石榴。我试图解析一个数字字符串:“androidid”,它在 LogCat 中显示为“Int0”。

标签: android tryparse


【解决方案1】:

使用Long (Long.parseLong()) 代替Integer,因为Integer.MAX_VALUE = 2 147 483 647,但您的android_id 是58 466 002 707,而UUID 是801 0597 0283。 Long.MAX_VALUE 是 9 223 372 036 854 775 807。

【讨论】:

  • 非常感谢,nfirex!这解决了我的问题!如果可以的话,我会支持这个,但我的声望在 15 岁以下。
  • 别提了,@Kevin :)
  • @Kevin 我会为你做的。这是 nfirex 的好地方。
猜你喜欢
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2013-10-09
相关资源
最近更新 更多