【问题标题】:NullPointerException not being thrown on Lollipop棒棒糖上没有抛出 NullPointerException
【发布时间】:2015-01-20 05:17:26
【问题描述】:

此代码(jar 文件)是由其他人编写的,它不是很干净,但在其他(旧)版本的 Android 上运行良好,但在 Lollipop 上存在问题,仅在调试模式下抛出 NullPointerException,否则测试应用程序只是挂起。此行为仅在 Lollipop 上可见。

我可以使用字符串重现该问题。

public class MyPlugin implements Runnable{

    public void run(){
    init();
    // Initialize done.
    }

    // Internally triggered when plug-in has to be stopped.

    private void stopPlugin(String message){
    try
    {
        Log.w("MyPlugin", "Lets make exception happen");
        String test=null;
        int value = test.length();
        Log.w("MyPlugin", "String Length " + value);
    }
    catch(Exception e)
    {
        Log.w("MyPlugin", "The exception was handled");
    }
  }
}

在旧版本的 android 中当 "test.length();"调用时,会抛出 NullPointerException,但在 Lollipop 上它不会触发异常。但是如果我进入调试模式,就会抛出异常。

知道这是为什么吗?

【问题讨论】:

  • 这种行为(IMO)完全不可信。但如果它真的发生了,那就是一个严重的平台错误。
  • @Vishvesh:如发布的代码长度方法在测试为空时调用。测试在哪里初始化??
  • @ρяσѕρєяK 我试图重现这个问题。测试未初始化。
  • @StephenC 我是否有可能在我的代码中做了一些愚蠢的事情来负责这个问题?当我在我的应用程序中尝试相同的事情时,会引发异常。问题在于 jar 文件。
  • 在 5.02 的调试器下存在一个已知的异常处理问题。 android-review.googlesource.com/#/c/123720 解决了这个问题。

标签: java android nullpointerexception android-5.0-lollipop


【解决方案1】:

这似乎是 Java 优化的结果。由于长度没有分配给变量,语句 test.length() 被优化器删除为冗余。

而只是做

Log.w("MyPlugin", "Lets make exception happen");
throw new NullPointerException();

这肯定会奏效。

【讨论】:

  • 是的,从那里抛出 NPE 似乎有效。我会做一些修改来确认优化。
  • 更新了代码,还是遇到了同样的问题。我正在使用 length() 方法返回的大小。我仍然不明白为什么它会挂起。
  • 取决于您如何更新代码。我会放一些类似 Log.d("Test", "The length is " + test.length()) 的东西,它应该会崩溃。
【解决方案2】:

在 5.02 中的调试器下存在一个已知的异常处理问题。 android-review.googlesource.com/#/c/123720 解决了这个问题。

【讨论】:

    猜你喜欢
    • 2015-05-18
    • 2015-08-12
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多