2012-03-01 31 views
9

Tôi nhận được ngoại lệ sau.java.math.BigInteger không thể truyền sang java.lang.Integer

Nguyên nhân:

java.lang.ClassCastException: java.math.BigInteger không thể được đúc để java.lang.Integer

với đoạn mã sau

List queryResult = query.list(); 

for (Iterator<Object[]> it = queryResult.iterator(); it.hasNext();) { 
    Object[] result = it.next(); 
    Integer childId = (Integer) result[0]; 
    Integer grandChildCount = (Integer) result[1]; 
    CompanyNode childNode = childNodes.get(childId); 
    childNode.setHasChildren(grandChildCount != 0); 
    childNode.setIsLeaf(grandChildCount == 0); 
} 

tại dòng này

Integer grandChildCount = (Integer) result[1]; 

Có ai có ý tưởng nào không?

+0

Cảm ơn tất cả mọi người, tôi đang thử nó ngay bây giờ trong sản xuất, hy vọng nó hoạt động ngay bây giờ. –

Trả lời

25

Bạn có thể sử dụng:

Integer grandChildCount = ((BigInteger) result[1]).intValue(); 

Hoặc có lẽ đúc để Number để bao gồm cả IntegerBigInteger giá trị.

+4

'.' ràng buộc chặt hơn so với dàn diễn viên, vì vậy kết quả' ((BigInteger) [1]). IntValue() 'sẽ được ưa thích hơn, tôi nghĩ vậy. –

+0

@RayToal - Bắt tốt. –

1

Cột trong cơ sở dữ liệu có thể là DECIMAL. Bạn nên xử lý nó như là một BigInteger, không phải là Integer, nếu không bạn sẽ mất chữ số. Hoặc thay đổi cột thành int.

8

Như chúng ta thấy từ javadoc, BigInteger không phải là một lớp con của Integer:

java.lang.Object      java.lang.Object 
    java.lang.Number      java.lang.Number 
     java.math.BigInteger     java.lang.Integer 

Và đó là lý do tại sao đúc BigInteger-Integer là không thể.

Đúc nguyên gốc java sẽ thực hiện một số chuyển đổi (như đúc từ double thành int) trong khi truyền các loại sẽ không bao giờ chuyển đổi các lớp.

+0

Tôi đã nhầm lẫn bởi vì cơ sở dữ liệu cục bộ được tạo ra với một Integer bởi hibernate và cùng nên xảy ra với sản xuất, nhưng nó đã được thay đổi thành một int trong sản xuất. –

Các vấn đề liên quan