【问题标题】:NullPointer when passing String Array between two activities in Android在Android中的两个活动之间传递字符串数组时的NullPointer
【发布时间】:2013-09-21 15:39:31
【问题描述】:

我正在尝试发送array of Strings,其中基本上包含设备上文件的路径。首先是用户Selects Picture 1,然后是Select Picture 2。一旦用户完成,数组就会被加载并传递给下一个活动。尝试接收变量时返回NullPointer。

主活动:

case SELECT_PICTURE1:
    if (resultCode == RESULT_OK) {
        // code here that gets the image path
        // String leftImagePath contains the path of selected Image
        // Used toast to display the image path and it is not null
        finished = true;
    }
    break;

case SELECT_PICTURE2:
    if (resultCode == RESULT_OK) {
        //similar to Select Picture 1
        // String rightImagePath contains the path of selected Image
        if (finished == true) {
            Bundle b = new Bundle();
            b.putStringArray("stringArray", new String[] {
                LeftImageString, RightImageString });
            Intent i = new Intent(MainActivity.this, modifiedImage.class);
            i.putExtras(b);
            // finished = false;
        }
    }
    break;

ModifiedImage 类:

Intent intent = getIntent();
_imagesPath = intent.getStringArrayExtra("IMAGES_PATH");
Bundle b= this.getIntent().getExtras();
_userImagePath = b.getStringArray("stringArray");


if (_imagesPath == null) {
    for (int i = 0; i <= 1; i++) {
         //null pointer on the following line because _userImagePath contains nothing.
        _imagesPath[i] = _userImagePath[i];
        _originalBitmaps[i] = BitmapFactory.decodeFile(_imagesPath[i]);
    }
}

有谁知道我做错了什么?

【问题讨论】:

  • @User1204501 我认为他的评论很清楚

标签: java android arrays string android-intent


【解决方案1】:

这段代码明显坏了:

if (_imagesPath == null) {
    for (int i = 0; i <= 1; i++) {
        _imagesPath[i] = _userImagePath[i];
        _originalBitmaps[i] = BitmapFactory.decodeFile(_imagesPath[i]);
    }
}

如果您进入 if 语句的主体,您知道 _imagesPath 为空 - 但是您在循环中取消引用它,而无需为变量分配新值。在我看来,您只想克隆数组:

if (_imagesPath == null) {
    _imagesPath = _userImagePath.clone();
}

...甚至只是复制参考:

if (_imagesPath == null) {
    _imagesPath = _userImagePath;
}

我怀疑你想无条件地为i 的每个适当值执行这行代码 - 为什么你只想在_imagesPath 以前为空的情况下这样做? p>

_originalBitmaps[i] = BitmapFactory.decodeFile(_imagesPath[i]);

(我也不清楚你在哪里初始化 _originalBitmaps,但那是另一回事。)

【讨论】:

  • 谢谢先生!早上第一件事就试试看。
  • 我检查路径是否为空的原因是因为用户有两个选择。从相机捕获图像,在这种情况下,图像路径会自动加载或从位置选择图像。还有其他方法吗?
  • @User1204501 你必须检查 null 然后检查值
  • @User1204501:恐怕我没有足够清楚地遵循您的评论(就代码的含义而言)。您是否需要能够在第二个活动中区分这两个选项?也许您应该无条件地将数据放在包中同名的“插槽”中。
  • @User1204501:我不会这么说 - 我会说您之前的代码显然已损坏,但我已经建议修复您遇到的问题。如果您想获得有关代码不同问题的答案,我建议您提出一个新问题。 (让一篇帖子问多个问题并不是一个好主意——尤其是如果其中一些问题最终只在 cmets 中被问到......)
【解决方案2】:

你没有在 Extra 中传递任何 IMAGES_PATH 那么你为什么期望目标活动中的值

  Intent intent = getIntent();
    _imagesPath = intent.getStringArrayExtra("IMAGES_PATH"); 
    Bundle b= this.getIntent().getExtras();
    _userImagePath = b.getStringArray("stringArray");

如果 _imagesPath 为空,那么您对 ​​_imagesPath 所做的每项操作(就像您在代码中所遵循的那样)都会抛出 NPE

只需添加一个 not '!'改变一切

if (_imagesPath != null) {

    for (int i = 0; i <= 1; i++) {
         //null pointer on the following line because _userImagePath contains nothing.
        _imagesPath[i] = _userImagePath[i];
        _originalBitmaps[i] = BitmapFactory.decodeFile(_imagesPath[i]);
    }
}

【讨论】:

  • IMAGE_PATH 已经从 MainActivity 传递过来。我只是没有包含完整的代码,因为这不会导致错误。
猜你喜欢
  • 2011-05-24
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
相关资源
最近更新 更多