为什么2D数组返回' null'?

时间:2014-06-10 09:36:51

标签: java android arrays multidimensional-array

我在主要活动中创建了一个2D字符串数组,但我在另一个活动中创建了新的:

public class MainActivity extends Activity 
{
  public String[][] arr;

  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    requestpayment requestpayment=new requestpayment(getApplicationContext(), 1, 8, "boy");

    TextView textView=(TextView)findViewById(R.id.text);
    textView.setText(arr[1][1].toString());
  }
}

在第二个Activity中,我使用这种形式的二维数组:

int i=1;
MainActivity mainActivity=new MainActivity();

mainActivity.arr= new String[5][5];         
mainActivity.arr[i][0] = FLName;
mainActivity.arr[i][1] = Old;
mainActivity.arr[i][2] = Image;
mainActivity.arr[i][3] = Gender;
mainActivity.arr[i][4] = Description

到这里و一切正常,我可以在第二项活动中使用数组金额

但在此格式的 mainactivity 中使用2d-array时:

 textView.setText(arr[1][1].toString());

返回null:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.../....main.MainActivity}: java.lang.NullPointerException

之前,我在另一个活动中创建一个 ArrayList 和New然后我在主活动中使用它并且工作正常,但是对于二维数组不起作用;

现在,我如何使用这个在另一个活动中创造新的数组

5 个答案:

答案 0 :(得分:0)

public String [] [] arr从未初始化。

你需要做类似的事情,

private String[][] arr = null;

public String[][] getArr()
{
    if(arr == null)
    {
        arr = new String[5][6];
    }
    return arr;
}

虽然我个人认为你可能想制作一个数组列表,或者可能是一个String数组列表。

List<String[]> list = new ArrayList<String[]>();

如果要在活动之间发送数组,则应该创建一个包含数组的holder类,使其可包含,并使用Intent Extras在活动之间发送持有者。 http://www.parcelabler.com/有助于使类Parcelable。

答案 1 :(得分:0)

您还没有显示足够的代码让我肯定地说,但是new调用使得看起来您的第二个类是在主类的不同实例上设置数组;你从不表现出他们之间的任何沟通。

答案 2 :(得分:0)

正如其他人所说,NullPointerException应该与您引用MainActivity的不同实例这一事实有关。请查看下面的代码,该代码仅在arr声明为静态并且在实际声明(而不是创建)的类中使用它之前发生数组时才起作用:

public class Main {
  public static void main(String[] args) {
    SecondClass sc = new SecondClass();
    sc.printArray(1, 1);

    FirstClass fc = new FirstClass();
    fc.printArray(1, 1);
  }
}

class FirstClass {
  public static String[][] arr;

  public void printArray(int i, int j) {
    System.out.println(arr[i][j]);
  }
}

class SecondClass {
  SecondClass(){}

  public void printArray(int i, int j) {
    FirstClass fc = new FirstClass();
    fc.arr = new String[5][5];

    for (int x=0; x<5; x++)
      for (int y=0; y<5; y++)
        fc.arr[x][y] = Integer.toString(x*y);

    System.out.println(fc.arr[i][j]);
  }
}

答案 3 :(得分:0)

好的......回答你的问题。 MainActivity mainActivity = new MainActivity();仅创建对象:实例化对象。在声明String [] []的第二个类中,您正在分配值,这很好(虽然不是一个好的设计,除非存在父/子类关系)。如果你要调用textView.setText(arr [1] [1] .toString());在第二课中你会得到这些值。但问题是没有回电。换句话说,你的主要课程不知道第二课正在做什么。

我会考虑其他方法来保存您的数据。但如果你这样做。您需要一种方法让第一个类知道您对数组的添加值。没有某种数据持久性将是困难的。

为什么你这样做首先不清楚。问题是你的设计。你为什么来回走动?没有押韵或理由。在将要使用的类中创建数组,如果它不在该类中使用,则使用数据存储来保存该数据(或通过intent将数据传递给下一个类;但仅使用基本类型)。有几种方法可以在Android中保留数据。阅读那里的多个教程 想想OOP原则。只有在必要时才传递信息。处理创建它的类中的信息(证实)。希望这可以帮助。

答案 4 :(得分:0)

//可以返回空的2d数组。 //只需创建一个如下所示的函数

public static int[][] subsets(int input[],int index) {
if(index==input.length)
{
    int arr[][]= {};
    return arr;
}