java.lang.ArrayStoreException at java.lang.System.arraycopy(Native Method) at java.util.ArrayList.toArray(Unknown Source) at Hai.main(Hai.java:20)

I am getting the following error when executing the code below...

I am trying to convert the list of Object arrays to a BigDecimal array using the toArray() method of the List collection..

When I simply give fileFormatObj.toArray() it is working fine, but when I give like in the code below I am getting the error....

public static void main(String[] args) 
{
    List<BigDecimal> objList = new ArrayList<BigDecimal>();
    List<Object[]> fileFormatObj = new ArrayList<Object[]>();
    final Object[] array1 = new Object[1];
    array1[0] = new BigDecimal(BigInteger.ONE);
    fileFormatObj.add(array1);
    if (fileFormatObj != null) 
    {
        //Error here java.lang.System.arraycopy    
        final BigDecimal[] arr = fileFormatObj
            .toArray(new BigDecimal[fileFormatObj.size()]);

        objList.addAll(Arrays.asList(arr));
        for (final BigDecimal object : arr) {
            System.out.println("TEST-->" + object.intValue());
        }
    }
}
Jon Skeet
people
quotationmark

The problem is that the element in fileFormatObj is an Object[], not a BigDecimal. Therefore you can't convert fileFormatObj to a BigDecimal[]. You can't even convert it to a BigDecimal[][] (as an Object[] isn't a BigDecimal[]) but at the moment you're trying to store an array reference in a BigDecimal[]...

It's not clear why you're trying to do it like this, but that's simply not going to work. If you edit your question to explain why you're trying to do this - what the bigger picture is - we can help you more.

If you absolutely have to convert a List<Object[]> to a BigDecimal[] and you want to take the first element of each array, you could use something like:

BigDecimal[] arr = new BigDecimal[fileFormatObj.size()];
for (int i = 0; i < arr.length; i++) {
    Object[] fileFormatArray = fileFormatObj.get(i);
    Object firstElement = fileFormatArray[0];
    arr[i] = (BigDecimal) firstElement;
}

You can do the whole for loop body in a single statement of course - I only split it up here to make it clear exactly where the cast to BigDecimal needs to happen.

people

See more on this question at Stackoverflow