Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

his is my code.... when I try to run it... the error message plz help me fix the

ID: 3802108 • Letter: H

Question

his is my code.... when I try to run it... the error message

plz help me fix the problem...

-----------------------------------------------------------------------------

java.io.InvalidClassException: Sphere; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 7497003029646850194
   at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
   at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
   at java.io.ObjectInputStream.readClassDesc(Unknown Source)
   at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
   at java.io.ObjectInputStream.readObject0(Unknown Source)
   at java.io.ObjectInputStream.readObject(Unknown Source)
   at ObjectSaver.readAllObjects(ObjectSaver.java:46)
   at Main.main(Main.java:77)
Exception in thread "main" java.lang.NullPointerException
   at Main.main(Main.java:78)

-----------------------------------------------------------------------------------

Main.java

public class Main {

   public static void main(String arg[]){
       Shape cone = new Cone(20,10);
       Shape ellipsoid = new Ellipsoid(5,10,15);
       Shape sphere = new Sphere(30);
      
       ObjectSaver<Shape> coneFile = new ObjectSaver<>( new File("cones.dat")); // should accpet any data file? .txt
       ObjectSaver<Shape> ellipsoidFile = new ObjectSaver<>( new File("ellipsoids.dat"));
       ObjectSaver<Shape> sphereFile = new ObjectSaver<>( new File("spheres.dat"));
      
       System.out.println( " write file test.............. ");
      
       try{
           // cone
           System.out.println("Cone ->" + cone);
           if(coneFile.writeOneObject(cone, false)) {
               System.out.println("written to file.");
           }
           // ellipsoid
           System.out.println("Ellipsoid ->" + ellipsoid);
           if(ellipsoidFile.writeOneObject(ellipsoid, false)){
               System.out.println("written to file.");
           }
           // sphere
           System.out.println("Sphere ->" + sphere);
           if(ellipsoidFile.writeOneObject(sphere, false)){
               System.out.println("written to file.");
       }
      
   }catch(NotSerializableException e){
       e.printStackTrace();
       }
      
       // some bug... not solved yet
       System.out.println( " read file test.............. ");
      
       //cone
       ArrayList<Shape> listFromFile = coneFile.readAllObjects();
       Iterator<Shape> iterator = listFromFile.iterator();
      
       System.out.println(" cone file: ");
      
       while (iterator.hasNext()){
           System.out.println(iterator.next());
       }
      
       //ellipsoid
       // problem
       listFromFile = ellipsoidFile.readAllObjects();
       iterator = listFromFile.iterator();
      
       System.out.println(" elliposid file: ");
      
       while (iterator.hasNext()){
           System.out.println(iterator.next());
       }
      
       //sphere
       // problem
       listFromFile = sphereFile.readAllObjects();
       iterator = listFromFile.iterator();
      
       System.out.println(" sphere file: ");
      
       while (iterator.hasNext()){
           System.out.println(iterator.next());
       }
      
      
       ArrayList<Shape> listOfShapes = new ArrayList<>();
       // add
       listOfShapes.add(cone);
       listOfShapes.add(ellipsoid);
       listOfShapes.add(sphere);
      
       System.out.println(" Min V is: " + ShapeUtilities.min(listOfShapes));
       System.out.println(" Max V is: " + ShapeUtilities.max(listOfShapes));
      
       iterator = listOfShapes.iterator();
      
       System.out.println("Sorted list is: ");
       while(iterator.hasNext()){
           System.out.println(iterator.next());
       }
   }
}

--------------------------------------------------------------

ObjectSaver.java

public class ObjectSaver<T> {

   private File file;
  
   public ObjectSaver(File file){
       this.file = file;
   }
   // readOneObject
   // this method should also throw an IOException if the parameter is outside the range of possible object positions in the file.
   public T readOneObject(int index) throws IOException{
       ArrayList<T> result = readAllObjects();
       // find object index and return back to function
       if((result == null) || (result.size() >= index)){ // if cannot read one, then return outside range  
           throw new IOException("parameter is outside the range");
       }
      
       else return result.get(index);
   }
  
   // readAllObjects
   // returns an ArrayList of Generic Type which holds all the objects read from the file.
   @SuppressWarnings("unchecked")
   public ArrayList<T> readAllObjects(){
       ArrayList<T> result;
      
       FileInputStream fileInputStream = null; // declare to null
       ObjectInputStream objectInputStream = null;
      
       try{
           fileInputStream = new FileInputStream(file);
           objectInputStream = new ObjectInputStream(fileInputStream);
          
           result = (ArrayList<T>) objectInputStream.readObject();
          
           return result; //
           // catch (FileNotFoundException e){e.printStackTrace();}
           // catch (IOException e){}
           // catch (Exception e){}
       }catch(FileNotFoundException e){
           e.printStackTrace();
       }catch(IOException e){
           e.printStackTrace();
       }catch(ClassNotFoundException e){
           e.printStackTrace();
       }finally{ // finally block use to exit try block
  

          
           if(fileInputStream != null){ // inputsteam -> close
               try{
                   fileInputStream.close();
               }catch(IOException e){
                   e.printStackTrace();
               }
           }
           else if(objectInputStream != null){
               try{
                   objectInputStream.close();
               }catch(IOException e){
                   e.printStackTrace();
               }
           }
       }
      
       return null;
   }
  
   // writeOneObject
   // takes a generic class type as a parameter.
   // takes a boolean value as a parameter.
   // if the value is true append to the end of the file, if false, overwrite the old contents of the file.
   // writes the object to the File.
   // this method should also throw a NotSerializableException.
  
   public boolean writeOneObject(T object, boolean append) throws NotSerializableException{
      
       ArrayList<T> fileContentWritten;
       if(append){
           fileContentWritten = readAllObjects();
       }
       else{
           fileContentWritten = new ArrayList<T>();
       }
      
       fileContentWritten.add(object);
      
       writeAllObjects(fileContentWritten, append);
      
       return true;
      
   }
     
   // writeAllObjects
   // takes an ArrayList of any type as a parameter.
   // takes a boolean value as a parameter.
   // if the value is true append to the end of the file, if false, overwrite the old contents of the file.
   // writes all the objects in the ArrayList to the File specified in the constructor.
   // this method should also throw a NotSerializableException.
  
   public boolean writeAllObjects(ArrayList<T> objectWritten, boolean append) throws NotSerializableException{
      
       FileOutputStream fileOutputStream = null; //// declare to null
       ObjectOutputStream objectOutputStream = null;
      
       try{
           fileOutputStream = new FileOutputStream(file);
           objectOutputStream = new ObjectOutputStream(fileOutputStream);
          
           objectOutputStream.writeObject(objectWritten);
       }catch (FileNotFoundException e){
           e.printStackTrace();
       }catch (IOException e){
           e.printStackTrace();
       }finally{ // finally block use to exit try block
           // https://docs.oracle.com/javase/ial/essential/exceptions/finally.html
          
       if(fileOutputStream != null){ // inputsteam -> close
           try{
               fileOutputStream.close();
           }catch(IOException e){
               e.printStackTrace();
           }
       }
       else if(objectOutputStream != null){
           try{
               objectOutputStream.close();
           }catch(IOException e){
               e.printStackTrace();
           }
       }
   } // readallObjects & writeAllObjects // input & output
  
   return true;
   }
  
}

------------------------------------------------------------------------

ShapeUtilities.java

public class ShapeUtilities {
   // recursiveSort()
   // This method takes an ArrayList of Bounded Generic type and
   // sorts it based on the volumes of the objects using the following algorithm.
   // The bound should only allow any Shape object and subclasses.
   public static <T extends Shape> ArrayList<T> recursiveSort(ArrayList<T> list){
      
       if(list != null && list.size() <= 1){
           return list; // if the list size <= 1
                       //return list
       }
       else{           // else select a middle element from the list and remove it
           int mid = list.size()/2;
           double midVolume = list.get(mid).getVolume();
          
           // creat 2 lists leftlist and rightlist
           ArrayList<T> leftList = new ArrayList<>();
           ArrayList<T> rightList = new ArrayList<>();
          
           Iterator<T> iterator = list.iterator();
          
           int i = 0;
           // if element is less than the middle element then add element to the right
           // else add to left
           while(iterator.hasNext()){ // object next() return next element
               T current = iterator.next();
               if (i != mid) {
                   if (current.getVolume() < midVolume){
                       rightList.add(current);
                   }
                   else{
                       leftList.add(current);
                   }
               }
               i++; // till string end;
           }
          
           leftList = recursiveSort(leftList);
           rightList = recursiveSort(rightList);
          
           ArrayList<T> result = new ArrayList<>();
           result.add(list.get(mid));
          
           if(leftList.size()>0){ // add result to leftlist
               leftList.addAll(result);
               result = leftList;
           }
           else if(rightList.size()>0){ // else do add on rightlist
               result.addAll(rightList);
           }
          
           return result; // return the combination of recursiveSort
       }
      
   }
   // min();
   // This method takes an ArrayList of Bounded Generic Type which only allows Shape objects and its subclasses.
   // The method should return the object with the maximum volume from the list of objects.
   public static <T extends Shape> T min(ArrayList<T> list){
      
       if(list != null && list.size() != 0){
          
           Iterator<T> iterator = list.iterator();
           T minVolumeShape = list.get(0);
          
           while(iterator.hasNext()){
               T currentShape = iterator.next();
              
               if(currentShape.getVolume() < minVolumeShape.getVolume()){
                   minVolumeShape = currentShape;
               }
           }
           // return the minimum volume from the list of obj
           return minVolumeShape;
       }
       else return null;
   }//
  
   // max();
   // This method takes an ArrayList of Bounded Generic Type which only allows Shape objects and its subclasses.
   // The method should return the object with the minimum volume from the list of objects.
   public static <T extends Shape> T max(ArrayList<T> list){
      
       if (list != null && list.size() != 0) {
             
   Iterator<T> iterator = list.iterator();
   T maxVolumeShape = list.get(0);
     
   while (iterator.hasNext()) {
         
   T currentShape = iterator.next();
     
   if (currentShape.getVolume() > maxVolumeShape.getVolume()) {
   maxVolumeShape = currentShape;
   }
   }
   // return the maximum volume from the list of obj
   return maxVolumeShape;
   }
       else return null;
   }// same as min
      
  
}

-----------------------------------------------------------------------------

Shape.java

public interface Shape {

   public double getVolume();
  
}

--------------------------------------------

Sphere.java

public class Sphere implements Shape, Serializable{
   private double radius;
  
   public Sphere(double radius){
       this.radius =radius;
   }
  
   @Override
   //getVolume
   public double getVolume(){
       return 3.14 * radius * radius * radius * 4 / 3 ;
   }
  
   public String toString(){
       return "Type of shape: Sphere, Radius is: " + radius + ", Volume is: " + getVolume();
   }
   // returns a string which includes the type of shape, the radius, and the volume.
  

}

-----------------------------------------------------------------------------

Ellipsoid.java

public class Ellipsoid implements Shape, Serializable{
   private double radius1;
   private double radius2;
   private double radius3;
  
  
   public Ellipsoid(double radius1, double radius2, double radius3){
       this.radius1 = radius1;
       this.radius2 = radius2;
       this.radius3 = radius3;
   }

   @Override
   //getVolume
   public double getVolume(){
       return 3.14 * radius1 * radius2 * radius3 * 4 / 3;
   }
  
   public String toString(){
       return "Type of shape: Ellipsoid, Radius 1 is: " + radius1 + " Radius 2 is: " + radius2 + " Radius 3 is: " + radius3 +
               ", Volume is: " + getVolume();
   }
   // returns a string which includes the type of shape, the radius, and the volume.
  
}

---------------------------------------------------------

Cone.java

public class Cone implements Shape, Serializable{
  
   private double height;
   private double radius;
  
   public Cone(double height, double radius){
       this.height = height;
       this.radius = radius;
   }
  
   @Override
   //getVolume
   public double getVolume(){
       return 3.14 * radius * radius * height / 3 ; // this one works
       // 1/3 * 3.14 * r * r *h doesnt work ???
   }
  
   public String toString(){
       return "Type of shape: Cone, Radius is: " + radius + ", Volume is: " + getVolume();
   }
   // returns a string which includes the type of shape, the radius, and the volume.
  
  
  

}

Explanation / Answer

There is a bug in main file, Please Replace your Old main File with this new file. You did not write object in spheres.dat file you are writing sphere object into ellipsoids.dat, thats why your sphere.dat file is empty and IOEXCEPTION generated.

import java.util.*;
import java.io.*;
public class Main {
public static void main(String arg[]){
Shape cone = new Cone(20,10);
Shape ellipsoid = new Ellipsoid(5,10,15);
Shape sphere = new Sphere(30);
  

ObjectSaver<Shape> coneFile = new ObjectSaver<>( new File("cones.dat")); // should accpet any data file? .txt
ObjectSaver<Shape> ellipsoidFile = new ObjectSaver<>( new File("ellipsoids.dat"));
ObjectSaver<Shape> sphereFile = new ObjectSaver<>( new File("spheres.dat"));
  
System.out.println( " write file test.............. ");
  
try{
// cone
System.out.println("Cone ->" + cone);
if(coneFile.writeOneObject(cone, false)) {
System.out.println("written to file.");
}
// ellipsoid
System.out.println("Ellipsoid ->" + ellipsoid);
if(ellipsoidFile.writeOneObject(ellipsoid, false)){
System.out.println("written to file.");
}
// sphere
System.out.println("Sphere ->" + sphere);
if(sphereFile.writeOneObject(sphere, false)){
System.out.println("written to file.");
}
  
}catch(NotSerializableException e){
e.printStackTrace();
}
  
// some bug... not solved yet
System.out.println( " read file test.............. ");
  
//cone
ArrayList<Shape> listFromFile = coneFile.readAllObjects();
Iterator<Shape> iterator = listFromFile.iterator();
  
System.out.println(" cone file: ");
  
while (iterator.hasNext()){
System.out.println(iterator.next());
}
  
//ellipsoid
// problem
listFromFile = ellipsoidFile.readAllObjects();
iterator = listFromFile.iterator();
  
System.out.println(" elliposid file: ");
  
while (iterator.hasNext()){
System.out.println(iterator.next());
}
  
//sphere
// problem
listFromFile = sphereFile.readAllObjects();
iterator = listFromFile.iterator();
  
System.out.println(" sphere file: ");
  
while (iterator.hasNext()){
System.out.println(iterator.next());
}
  
  
ArrayList<Shape> listOfShapes = new ArrayList<>();
// add
listOfShapes.add(cone);
listOfShapes.add(ellipsoid);
listOfShapes.add(sphere);
  
System.out.println(" Min V is: " + ShapeUtilities.min(listOfShapes));
System.out.println(" Max V is: " + ShapeUtilities.max(listOfShapes));
  
iterator = listOfShapes.iterator();
  
System.out.println("Sorted list is: ");
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}

// RUn Your Complete Code with this new main File. Your Output is looks like

run:
write file test..............
Cone ->Type of shape: Cone, Radius is: 10.0, Volume is: 2093.3333333333335
written to file.
Ellipsoid ->Type of shape: Ellipsoid, Radius 1 is: 5.0 Radius 2 is: 10.0 Radius 3 is: 15.0, Volume is: 3140.0
written to file.
Sphere ->Type of shape: Sphere, Radius is: 30.0, Volume is: 113040.0
written to file.
read file test..............
cone file:
Type of shape: Cone, Radius is: 10.0, Volume is: 2093.3333333333335
elliposid file:
Type of shape: Ellipsoid, Radius 1 is: 5.0 Radius 2 is: 10.0 Radius 3 is: 15.0, Volume is: 3140.0
sphere file:
Type of shape: Sphere, Radius is: 30.0, Volume is: 113040.0
Min V is: Type of shape: Cone, Radius is: 10.0, Volume is: 2093.3333333333335
Max V is: Type of shape: Sphere, Radius is: 30.0, Volume is: 113040.0
Sorted list is:
Type of shape: Cone, Radius is: 10.0, Volume is: 2093.3333333333335
Type of shape: Ellipsoid, Radius 1 is: 5.0 Radius 2 is: 10.0 Radius 3 is: 15.0, Volume is: 3140.0
Type of shape: Sphere, Radius is: 30.0, Volume is: 113040.0
BUILD SUCCESSFUL (total time: 0 seconds)