Pages

Wednesday, December 8, 2021

java lang ClassCastException [Fixed]

1. Overview

In this article, we will learn what is java.lang.ClassCastException in java and how to fix it.

We will look at the meaning of ClassCastException and a few examples of it.

java lang ClassCastException



2. What is the meaning of ClassCastException


From API, ClassCastException is thrown to indicate that the code has attempted to cast an object to a subclass of which it is not an instance. 

If you are not clear what is ClassCastException then look at the below example.

For example, the following code generates a ClassCastException:

Object x = new Integer(0);
System.out.println((String)x);

In this example, we are trying to cast an Integer object into a String. That means converting the Integer object into a String. This operation produced the class cast exception.

The reason behind this error is there is no direct relation between the Integer and String classes.

If there is a Has-a or Is-a relationship between the two classes then the casting is possible, if there is no relation between the classes and if we try to cast it to another class or interface then we get the ClassCastException.


3. Java ClassCastException Examples


A few examples to see in which scenarios we get the class cast exception at runtime.

Example 1
package com.javaprogramto.exception;

public class ClassCastExceptionExample {

	public static void main(String[] args) {

		Object s = "hello";
		Integer i = (Integer) s;
	}
}

Output
Exception in thread "main" java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap')
	at com.javaprogramto.exception.ClassCastExceptionExample.main(ClassCastExceptionExample.java:8)

Example 2

In this example, class B extends class B that means B is a child of A. Child class object can be assinged to the parent class object but the parenet class object can not be assinged to the child class.

So here we have casted class A instance to class B. This code is resulted in classcastexception.


package com.javaprogramto.exception.classcaseexception;

public class ClassCastExceptionExample {

	public static void main(String[] args) {
		A a = new A();
		B b = (B) a;
	}
}

class A {

}

class B extends A {

}

Output
Exception in thread "main" java.lang.ClassCastException: class com.javaprogramto.exception.classcaseexception.A cannot be cast to class com.javaprogramto.exception.classcaseexception.B (com.javaprogramto.exception.classcaseexception.A and com.javaprogramto.exception.classcaseexception.B are in unnamed module of loader 'app')
	at com.javaprogramto.exception.classcaseexception.ClassCastExceptionExample.main(ClassCastExceptionExample.java:7)


Example 3
package com.javaprogramto.exception.classcaseexception;

import java.util.ArrayList;
import java.util.List;

public class ClassCastExceptionExample2 {

	public static void main(String[] args) {

		List list = new ArrayList<>();

		list.add(10);
		list.add(20);
		list.add("String");
		list.add(30);

		for (int i = 0; i < list.size(); i++) {
			Integer value = (Integer) list.get(i);
			System.out.println(value);
		}
	}
}

Ouptut
10
20
Exception in thread "main" java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer (java.lang.String and java.lang.Integer are in module java.base of loader 'bootstrap')
	at com.javaprogramto.exception.classcaseexception.ClassCastExceptionExample2.main(ClassCastExceptionExample2.java:18)

This example is resulted in error becaues of list has string in it and we casted each value of list into Integer. Once it found the string then it is not able to cast into the integer. So, ended up in exception.


4. How to fix ClassCastException


ClassCastException is a unchecked exception that is thrown by the JVM at runtime when you do the invalid or illegal casting is done. 

Finding the ClassCastException at the compile time can not be done as similar to the checked exceptions. 

So, we must be careful when we do the explicit casting to the different types.

To fix ClassCastException, we need to follow the strict generics when working with the collections API.
In the above section example 3, a list is created without generic type which did not show any error at the compile time but it produces the casting exception at the runtime.

Look at the below code how ClassCastException is eliminated at the compile time.

Example 4

package com.javaprogramto.exception.classcaseexception;

import java.util.ArrayList;
import java.util.List;

public class ClassCastExceptionExample2 {

	public static void main(String[] args) {

		List<Integer> list = new ArrayList<>();

		list.add(10);
		list.add(20);
		list.add("String");
		list.add(30);

		for (int i = 0; i < list.size(); i++) {
			Integer value = (Integer) list.get(i);
			System.out.println(value);
		}
	}
}

Output
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	The method add(Integer) in the type List<Integer> is not applicable for the arguments (String)

	at com.javaprogramto.exception.classcaseexception.ClassCastExceptionExample2.main(ClassCastExceptionExample2.java:14)

In the above example, the class cast exception is suppressed and caught at the compile time. So we can take out the string from the list.

Another way is to fix class cast exception is with instanceof oeprator.

Example 5
package com.javaprogramto.exception.classcaseexception;

public class ClassCastExceptionExample3 {

	public static void main(String[] args) {
		C c = new C();

		if (c instanceof D) {
			D d = (D) c;
		} else {
			System.out.println("c is not instance of d. skipping..");
		}
	}
}

class C {

}

class D extends C {

}

Output
c is not instance of d. skipping..

If you know any other ways, please post in the comments we will update the post.

5. Conclusion


In this tutorial, We've seen understood the meaning of Java ClassCastException which is present in the java.lang package.

how to fix java.lang.classcaseexception in java.




No comments:

Post a Comment

Please do not add any spam links in the comments section.