我有一个数组,现在我想创建该数组的副本,以便我可以保留数组的先前值。
我试过这样的事情:
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
请建议我如何正确创建数组副本。
答案 0 :(得分:2)
作为例外情况,您没有为目的地分配内存。在System.arrayCopy调用之前
secondArray = new String[first.length]
如果secondArray
属于String类型。否则你必须相应地改变它
答案 1 :(得分:0)
非常简单试试这个
String arr2[] = arr1.clone();
答案 2 :(得分:0)
根据你获得的异常判断,我会说secondArray参数为null。
您可以通过简单的“克隆”来复制任何数组,如下所示:
String [] copy = 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的所谓深度复制。
另请注意,在String数组的情况下不会出现此问题,因为字符串是不可变的。
HTH
答案 3 :(得分:0)
String[] secondArray = new String[first.length]
for(int i=0; i<firstArray.length; i++){
secondArray[i]=firstArray[i]
}