溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java.lang.ArrayStoreException異常怎么解決

發布時間:2021-12-30 13:31:26 來源:億速云 閱讀:1442 作者:iii 欄目:開發技術

本篇內容主要講解“java.lang.ArrayStoreException異常怎么解決”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java.lang.ArrayStoreException異常怎么解決”吧!

java.lang.ArrayStoreException異常

異常提示

java.lang.ArrayStoreException: java.lang.Boolean
at java.util.stream.Nodes$FixedNodeBuilder.accept(Nodes.java:1222)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:545)
at java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:438)
at

查詢百度的解釋:試圖將錯誤類型的對象存儲到一個對象數組時拋出的異常。之后,在看看自己錯誤的代碼:

Field[] filterCopyFields = Stream.of(appendFields)
     .map(f -> !preFieldNames.contains(f.getName())).toArray(Field[]::new);

很容易看出問題的所在,這里我是想過濾Field[]數組中的元素,!preFieldNames.contains(f.getName())這個是過濾條件,發現了這里使用的居然是map,過濾應該是使用filter,map中的元素應該是返回結果并在toArray方法中轉換成數組,這里map中返回的是Boolean布爾類型的數據,也就是說不能將boolean類型的對象存儲到Field對象數組中。

這里可以看一下JDK8源碼中對toArray(IntFunction<A[]> generator)方法的定義:

/**
     * Returns an array containing the elements of this stream, using the
     * provided {@code generator} function to allocate the returned array, as
     * well as any additional arrays that might be required for a partitioned
     * execution or for resizing.
     *
     * <p>This is a <a href="package-summary.html#StreamOps" rel="external nofollow" >terminal
     * operation</a>.
     *
     * @apiNote
     * The generator function takes an integer, which is the size of the
     * desired array, and produces an array of the desired size.  This can be
     * concisely expressed with an array constructor reference:
     * <pre>{@code
     *     Person[] men = people.stream()
     *                          .filter(p -> p.getGender() == MALE)
     *                          .toArray(Person[]::new);
     * }</pre>
     *
     * @param <A> the element type of the resulting array
     * @param generator a function which produces a new array of the desired
     *                  type and the provided length
     * @return an array containing the elements in this stream
     * @throws ArrayStoreException if the runtime type of the array returned
     * from the array generator is not a supertype of the runtime type of every
     * element in this stream
     */
    <A> A[] toArray(IntFunction<A[]> generator);

可以看到toArray()的參數是IntFunction<A[]>類型,從@param A the element type of the resulting array這個注解中可以看到,A是表示返回數組的元素類型,在我的例子中返回類型是一個Field,而如果Stream中使用了map遍歷,返回的類型又是Boolean,類型不匹配而出現錯誤。

解決更改

Field[] filterCopyFields = Stream.of(appendFields)
     .filter(f -> !preFieldNames.contains(f.getName())).toArray(Field[]::new);

其實這種小問題應該很容易避免,在出現ArrayStoreException異常時應該對應著數組中的元素類型去查找錯誤,構造數組時應按照正確的類型來構造。

Java工具類List的toArray方法及java.lang.ArrayStoreException

1.List接口中有兩個方法

Object[] toArray(); 
T[] toArray(T[] a);

分析:不帶參數的方法默認是把數組轉換為Object類型,而帶參數的方法會將數組轉換為指定的類型;

指定目標數組數據類型:

List<Integer> list = new ArrayList<Integer>();
        list.add(12);
        list.add(13);
        list.toArray(new Integer[list.size()]);

不指定目標數組數據類型獲得的數組類型是Object類型:

List<Integer> list = new ArrayList<Integer>();
        list.add(12);
        list.add(13);
        list.toArray();

2.使用toArray方法是出現java.lang.ArrayStoreException異常

public class StingUtilsTest{
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(12);
        list.add(13);
        list.toArray(new Long[list.size()]);
    }
}

Exception in thread "main" java.lang.ArrayStoreException
at java.lang.System.arraycopy(Native Method)
at java.util.ArrayList.toArray(ArrayList.java:390)
at common.lang.StingUtilsTest.main(StingUtilsTest.java:23)

分析:出現這種異常是由于數組中存入的數據與要轉換的目標數組的類型不一致導致的;還有一點需要注意的是toArray參數數組的初始化大小如果list.size大于等于list的列表的長度那么就默認使用當前的參數數組,如果小于list的長度就會重新創建一個數組,建議如果知道list的長度一定要初始化數組的長度,這樣可以節省內存空間,提高效率;

到此,相信大家對“java.lang.ArrayStoreException異常怎么解決”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女