2
java.lang.ClassCastException: java.lang.Float cannot be cast to java.lang.String

I am getting this exception in follwing code:

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

Where ForSave is a vector of String containing table values, I can not understant why this exception is thrown.

Below is the full Stack Trace of the excption.

Stack Trace Of Exception

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

Lots of thanks in advance for providing an answer as i am stuck with that.

4 Answers 4

3

From your comment it appears you are using an incorrect generic type.

e.g.

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: I have no idea why you would use a combination of elementAt(index) and get(index) as these are the old (pre Java 1.2) and newer styles (post Java 1.2) unless Swing requires it. ;)


I would use this to reverse an incorrect generic type, although fixing the type would be better.

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

as you cannot cast a Float to a String. You can instead turn it into a String.

6
  • In that case, the cast is redundant and the generic type for your collection is incorrect. I have edited my solution. Commented Mar 21, 2012 at 12:50
  • Vector<Vector<String>> data_ForSave = new Vector<Vector<String>>(); is my declaration Commented Mar 21, 2012 at 12:55
  • So in this collection you have added a Float using an unchecked operation. When you try to retrieve it, there is an exception. I have added a workaround if you cannot find where the Float is being added, but its better to fix it so this doesn't happen. Commented Mar 21, 2012 at 12:59
  • Great thanks to you for taking the time as your new answer solve my problem.(:- Commented Mar 21, 2012 at 13:12
  • but problem is that I am using vector which is binded with the data model of my jtable tell me how ca i use array list in this case Commented Mar 21, 2012 at 13:17
3

The problem is that data_ForSave.elementAt(r).get(ColValindex) is returning a Float, not a String. If you want to format it as a string — e.g., you want 3.45 to be converted to "3.45", then you can write:

String colValue= data_ForSave.elementAt(r).get(ColValindex).toString();
4
  • Your solution generating the same error when i applied. Thanks Commented Mar 21, 2012 at 12:52
  • Even if it's specified as a Vector<String>, you might be doing some evil unsafe casting somewhere to make it contain a Float. The exception you're getting proves the vector contains a Float, whether or not it's supposed to; if it's not supposed to contain floats, then that's what you need to debug. Commented Mar 21, 2012 at 12:59
  • I find it hard to believe that this solution did not work. The answer is correct in that Java will not allow you to directly cast a Float object to a String. Try the following statement: String s = new Float(1.23).toString(); This should work fine, and is basically what the answer is telling you to do. However, the statement String s = (String) new Float(1.23) will result in a CastClass exception. Commented Mar 21, 2012 at 18:22
  • @HowardSchutzman: The reason it didn't work is that generics in Java use "type erasure", whereby type parameters don't exist at runtime. The OP had inserted a Float into an object of runtime type Vector, and was trying to retrieve the element via a reference with compile-time type Vector<String> (thereby triggering an implicit cast to String). The explicit String cast was a red herring. Commented Mar 21, 2012 at 18:29
1

Change the declaration of data_ForSave to

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

and your IDE should guide you to the source of this problem through errors or warnings.

3
  • When the OP wrote, "ForSave is a vector of String containing table values", that meant, "ForSave is a vector of table values that contain Strings". Commented Mar 21, 2012 at 12:52
  • Yes obviously Vector<Vector<String>> data_ForSave = new Vector<Vector<String>>(); is my declaration Commented Mar 21, 2012 at 12:54
  • Yikes - "string containing table values" - I (mis)understood "string(s) containing table values". Anyway - Vector should be parametized. Commented Mar 21, 2012 at 14:11
0

As per your comment, what I see is ForSave vector is not generic. So, when you trying to cast it without instanceof validation, it will give you a error. What I suggest is:

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);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.