-2

我有一个数组,现在我想创建该数组的副本,以便可以保留数组的先前值。

我试过这样的事情:

System.arraycopy(firstArray, 0, secondArray, 0, firstArray.length);

但它给了我一个NullPointerException,即:

08-26 13:20:08.421: E/AndroidRuntime(23739): FATAL EXCEPTION: main
08-26 13:20:08.421: E/AndroidRuntime(23739): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.iweentravel/com.android.iweentravel.MainAcvtivity}: java.lang.NullPointerException: dst == null
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.ActivityThread.access$600(ActivityThread.java:149)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1300)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.os.Looper.loop(Looper.java:153)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.ActivityThread.main(ActivityThread.java:4987)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at java.lang.reflect.Method.invokeNative(Native Method)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at java.lang.reflect.Method.invoke(Method.java:511)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at dalvik.system.NativeStart.main(Native Method)
08-26 13:20:08.421: E/AndroidRuntime(23739): Caused by: java.lang.NullPointerException: dst == null
08-26 13:20:08.421: E/AndroidRuntime(23739):    at java.lang.System.arraycopy(Native Method)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at com.android.iweentravel.MainAcvtivity.onCreate(MainAcvtivity.java:99)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.Activity.performCreate(Activity.java:5020)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
08-26 13:20:08.421: E/AndroidRuntime(23739):    ... 11 more

请建议我如何正确创建数组的副本。

4

4 回答 4

2

作为例外情况,您没有为目的地分配内存。在 System.arrayCopy 调用之前

secondArray = new String[first.length]

ifsecondArray是 String 类型。否则你必须相应地改变它

于 2013-08-26T07:58:43.700 回答
1

从你得到的异常来看,我会说 secondArray 参数为空。

您可以通过简单的“克隆”来复制任何数组,如下所示:

String[] 复制 = orig.clone();

它将构造一个带有一组新指针的新数组。这将允许您修改新数组,而不会干扰原始数组。

请注意,当您的数组包含对象时,不会复制数组 CONTENT。新数组只是指向相同数据的一组新指针。观察:

Object[] a1 = new Object[3];
a1[0] = objectA;
a1[1] = objectB;
a1[2] = objectC;
Object[] a2 = a1.clone();

a2[0] 现在指向与 a1[0] 完全相同的对象实例。因此,如果您要修改指向 a2[0] 的对象中的某些内容,您实际上将更改为 a1[0] 指向的对象。

如果您也不想这样做,则必须执行以下操作:

Object[] a2 = new Object[a1.length];
for (int n=0; n<a1.length; ++n)
  a2[n] = a1[n].clone();

这将导致数组 a1 的所谓深拷贝。

另请注意,在字符串数组的情况下不会出现此问题,因为字符串是不可变的。

高温高压

于 2013-08-26T08:12:00.483 回答
0

很简单试试这个

String arr2[] = arr1.clone();
于 2013-08-26T08:00:53.947 回答
0
String[] secondArray = new String[first.length]

for(int i=0; i<firstArray.length; i++){
   secondArray[i]=firstArray[i]
}
于 2013-08-26T08:12:16.477 回答