这是一个通用扩充数组的程序,我编了两次。第一次是通过的,而且结果也是预期之中,可是第二次重编之后却出现问题了,我也查不出那里和书上有出入的地方。但这次却报错了。报错如下:
java.lang.NullPointerException
at ArrayGrowTest.arrayPrint(ArrayGrowTest.java:37)
at ArrayGrowTest.main(ArrayGrowTest.java:9)
Exception in thread "main" 
我认为是这样的:数组扩充了,但没有填充扩充之后的数组,只是把原数组COPY,所以出现NullPointerException。但第一次却不会出现这种情况。
程序如下:
import java.lang.reflect.*;
import java.util.*;
public class ArrayGrowTest
{
public static void main(String[] args)
{
int[] a={1,2,3,4,5,6,7,8,9,10};
a=(int[])goodArrayGrow(a);
arrayPrint(a);
String[] b={"Tom","Dick","Harry"};
b=(String[])goodArrayGrow(b);
arrayPrint(b);
System.out.println("The following call generate an exception.");
b=(String[])badArrayGrow(b);
}
static Object[] badArrayGrow(Object[] a)
{
int newLength =a.length*11/10+10;
Object[] newArray=new Object[newLength];
System.arraycopy(a,0,newArray,0,a.length);
return newArray;
}
static Object goodArrayGrow(Object a)
{
Class cl=a.getClass();
if(cl.isArray())
return null;
Class componentType=cl.getComponentType();                                                                             
int l=Array.getLength(a);
int newLength=l*11/10+10;
Object newArray=Array.newInstance(componentType,newLength);
System.arraycopy(a,0,newArray,0,l);
return newArray;
}
static void arrayPrint(Object a)
{
Class cl=a.getClass();
if(!cl.isArray()) return;
Class componentType=cl.getComponentType();
int length=Array.getLength(a);
System.out.print(componentType.getName()+"["+length+"]={");
for(int i=0;i<Array.getLength(a);i++)
System.out.print(Array.get(a,i)+" ");
System.out.println("}");
}
}