java.lang.CloneNotSupportedException throws when object’s class does not implement the cloneable interface and clone method in class Object has been called to clone an object.
Some applications that override the clone method can also throw this exception to indicate that an object could not or should not be cloned.
Cloneable is marker interface which is not having any method to implement. When implement marker interface in class it indicate to JVM how to treat with this objects.
For more info about marker interface , it’s type and how to create check below link.
Marker Interface in Java, Use and Custom Marker Interface
clone() is protected method of object class which is super class of all the classes. if need to use clone() method have to override it .
Constructors :
- CloneNotSupportedException()
Create a CloneNotSupportedException object with no detail message.
- CloneNotSupportedException(String message)
Create a CloneNotSupportedException object with exception detail message.
Example
In below example creating clone object of Employee class from object there is no any compile time error because we have override clone method of Object Class in Employee class but it will throw CloneNotSupportedException while execution because as per
Contract : if cloneable interface is implemented then only clone method will call otherwise JVM will throw CloneNotSupportedException.
Here we are doing Shallow cloning of object. For more info on shallow and deep cloning follow below link.
Employee Class
public class Employee { private String firstName; private String lastName; private int age; private double salary; private Address address; public Employee(String firstName, String lastName, int age, double salary, Address address) { super(); this.firstName = firstName; this.lastName = lastName; this.age = age; this.salary = salary; this.address = address; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } @Override public String toString() { return "Employee [firstName=" + firstName + ", lastName=" + lastName + ", age=" + age + ", salary=" + salary + ", address=" + address + "]"; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
Address Class
public class Address { private String addressLine1; private String city; private String state; private String contry; private String pincode; public Address(String addressLine1, String city, String state, String contry, String pincode) { super(); this.addressLine1 = addressLine1; this.city = city; this.state = state; this.contry = contry; this.pincode = pincode; } public String getAddressLine1() { return addressLine1; } public void setAddressLine1(String addressLine1) { this.addressLine1 = addressLine1; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getContry() { return contry; } public void setContry(String contry) { this.contry = contry; } public String getPincode() { return pincode; } public void setPincode(String pincode) { this.pincode = pincode; } @Override public String toString() { return "Address [addressLine1=" + addressLine1 + ", city=" + city + ", state=" + state + ", contry=" + contry + ", pincode=" + pincode + "]"; } }
Test for ClassNotSupportedException
public class CloneExample { public static void main(String[] args) { Address address = new Address("Next to Metro Station", "Noida", "UP", "India", "201301"); Employee employee = new Employee("Saurabh", "Gupta", 30, 50000, address); System.out.println("Employee Object Before Clone :"); System.out.println(employee); try { System.out.println("Employee Object After Clone :"); Employee employeeCopy = (Employee) employee.clone(); System.out.println(employeeCopy); } catch (CloneNotSupportedException ex) { ex.printStackTrace(); } } }
Output
Employee Object Before Clone : Employee [firstName=Saurabh, lastName=Gupta, age=30, salary=50000.0, address=Add ress [addressLine1=Next to Metro Station, city=Noida, state=UP, contry=India, pi ncode=201301]] Employee Object After Clone : java.lang.CloneNotSupportedException: Employee at java.lang.Object.clone(Native Method) at Employee.clone(Employee.java:55) at CloneExample.main(CloneExample.java:11)
Solutions :
To solve this CloneNotSupportedException we have to implement cloneable interface in Employee class as below and run this program again.
public class Employee implements Cloneable<span id="mce_SELREST_start" style="overflow:hidden;line-height:0"></span>{ }
Summary :
- Explain about CloneNotSupportedException by example and how it happen.
- Constructors of CloneNotSupportedException.
- How to fix CloneNotSupportedException.
- Cloneable Marker Interface.
References :
https://docs.oracle.com/javase/8/docs/api/java/lang/CloneNotSupportedException.html
You must log in to post a comment.