2012-03-21 244 views
1
java.lang.ClassCastException: java.lang.Float cannot be cast to java.lang.String 

我得到這個例外在follwing代碼:java.lang.ClassCastException:java.lang.Float中不能轉換爲java.lang.String

String colValue= (String)data_ForSave.elementAt(r).get(ColValindex); 

哪裏ForSave是字符串包含矢量表值,我不明白爲什麼會拋出這個異常。

下面是excption的完整堆棧軌跡。

堆棧跟蹤異常

java.lang.ClassCastException: java.lang.Float cannot be cast to java.lang.String 
at Utilities.Utility.DataHeaderMapping(Utility.java:1122) 
at jewelleryerpapplication.GUI.ProductsInformation.jbtnSaveActionPerformed(ProductsInformation.java:4222) 
at jewelleryerpapplication.GUI.ProductsInformation.access$1500(ProductsInformation.java:40) 
at jewelleryerpapplication.GUI.ProductsInformation$37.actionPerformed(ProductsInformation.java:3292) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6505) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
at java.awt.Component.processEvent(Component.java:6270) 
at java.awt.Container.processEvent(Container.java:2229) 
at java.awt.Component.dispatchEventImpl(Component.java:4861) 
at java.awt.Container.dispatchEventImpl(Container.java:2287) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
at java.awt.Container.dispatchEventImpl(Container.java:2273) 
at java.awt.Window.dispatchEventImpl(Window.java:2713) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707) 
at java.awt.EventQueue.access$000(EventQueue.java:101) 
at java.awt.EventQueue$3.run(EventQueue.java:666) 
at java.awt.EventQueue$3.run(EventQueue.java:664) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
at java.awt.EventQueue$4.run(EventQueue.java:680) 
at java.awt.EventQueue$4.run(EventQueue.java:678) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 
Row : 0 

很多感謝的提前,因爲我堅持與提供的答案。

回答

4

從您的評論看來,您使用的是不正確的通用類型。

例如

Vector g = new Vector(); 
List list = new ArrayList(); 
list.add(1.0f); 
g.add(list); 

Vector<List<String>> grid = g; // incorrect cast, but only a warning. 
String s = g.elementAt(0).get(0); // throws a class cast exception. 

BTW:我不知道爲什麼你會使用的ElementAt(指數)的組合,並得到(指數),因爲這些都是老(前的Java 1.2)和新的樣式(後Java 1.2的),除非鞦韆要求它。 ;)


我會用它來扭轉不正確的泛型類型,雖然修復類型會更好。

List list = (List) data_ForSave.elementAt(r); 
String colValue= String.valueOf(list.get(ColValindex)); 

因爲您不能將Float轉換爲字符串。你可以把它變成一個字符串。

+0

您的解決方案會產生相同的錯誤。謝謝 – 2012-03-21 12:47:58

+0

在這種情況下,演員陣容是多餘的,您的收藏的通用類型不正確。我編輯了我的解決方案。 – 2012-03-21 12:50:23

+0

Vector > data_ForSave = new Vector >();是我的聲明 – 2012-03-21 12:55:49

4

問題是data_ForSave.elementAt(r).get(ColValindex)正在返回Float而不是String。如果你想格式化爲一個字符串—例如,你想3.45轉換爲"3.45",那麼你可以這樣寫:

String colValue= data_ForSave.elementAt(r).get(ColValindex).toString(); 
+0

您的解決方案在應用時會產生相同的錯誤,謝謝 – 2012-03-21 12:52:53

+0

即使它被指定爲'Vector ',您可能會在某處進行一些惡意的不安全的投射,以使其包含「Float」。 *證明*向量包含一個'Float',不管它是否應該;如果它不應該包含浮點數,那麼_that's_你需要調試 – 2012-03-21 12:59:48

+0

我覺得很難相信這個解決方案不起作用。答案是正確的,因爲Java不允許你直接將一個Float對象轉換爲一個字符串,請嘗試以下語句:String s = new Float(1.23).toString();這應該很好,基本上答案是告訴你要做的。但是,語句String s =(String)new Float(1.23)將導致CastClass異常。 – 2012-03-21 18:22:07

1

變化data_ForSave的聲明

Vector<String> data_ForSave = new Vector<String>(); 

和你的IDE應該通過錯誤或警告指導您解決此問題的根源。

+0

當OP寫道:「'ForSave'是包含表值的'String'的向量,這意味着''ForSave'是包含'String'的表值向量。 – ruakh 2012-03-21 12:52:03

+0

是的顯然Vector > data_ForSave = new Vector >();是我的聲明 – 2012-03-21 12:54:55

+0

Yikes - 「包含表值的字符串」 - I(mis)理解「包含表值的字符串」。無論如何 - 'Vector'應該是參數化的。 – 2012-03-21 14:11:07

0

根據您的評論,我看到的是ForSave向量不是通用的。所以,當你試圖在沒有實例驗證的情況下投射它時,它會給你一個錯誤。我建議的是:

String colValue = ""; 
if(data_ForSave.elementAt(r).get(ColValindex) instaceof Float) 
    colValue = String.valueOf(data_ForSave.elementAt(r).get(ColValindex)); 
else 
    colValue = data_ForSave.elementAt(r).get(ColValindex); 
相關問題