I'm almost done with this project which involves converting between Celsius, Fahrenheit, and Kelvin and the last thing I need is to figure out the cloning method. The task is "clone, which takes no formal parameters and returns a reference to a newly created Temperature object that has the same value and scale as the object of which it is a clone ". My code compiles, but when run in the client program, i recieve an error of java.lang.StackOverflowError at Temperature.clone(Temperature.java:134)
public class Temperature {
private double value;
private String scale;
public Temperature() { // default constructor
this.value = 0;
this.scale = "C";
}
public Temperature(double value, String scale) {
this.value = value;
this.scale = scale;
}
public double getValue() {
return this.value;
}
public String getScale() {
return this.scale;
}
public double getCelsius() {
if (scale.equalsIgnoreCase("C")) {
return this.value;
} else if (scale.equalsIgnoreCase("F")) {
double faren = ((this.value - 32) * (5 / 9));
return faren;
} else {
double kelvin = (this.value - 273.15);
return kelvin;
}
} // end getCelcius
public double getFaren() {
if (scale.equalsIgnoreCase("F")) {
return this.value;
} else if (scale.equalsIgnoreCase("C")) {
double celsius = ((this.value * 1.8) + 32);
return celsius;
} else {
double kelvin = ((this.value * 1.8) - 459.67);
return kelvin;
}
} // ene getFaren
public double getKelvin() {
if (scale.equalsIgnoreCase("K")) {
return this.value;
} else if (scale.equalsIgnoreCase("C")) {
double celsius = (this.value + 273.15);
return celsius;
} else {
double faren = ((this.value + 459.67) * (5 / 9));
return faren;
}
} // end getKelvin
public void setTemperature(Temperature t) {
this.value = t.value;
}
public void setType(double degree, String measure) {
this.value = degree;
this.scale = measure;
}
public void setValue(double degree) {
this.value = degree;
}
public void setScale(String measure) {
this.scale = measure;
}
public double convertToCelsius() {
this.scale = "C";
return this.value = getCelsius();
}
public double convertToFaren() {
this.scale = "F";
return this.value = getFaren();
}
public double convertToKelvin() {
this.scale = "K";
return this.value = getKelvin();
}
public Temperature clone() {
this.value = value;
this.scale = scale;
return clone();
}
}
The cloning method is the last method, so any help would really be appreciated. I'm not sure where I'm going wrong! This is my first time using this website, so apologies for the formatting!
I don't want to give you the answer to a homework project, that's frowned upon. However, the problems with your clone() method are hard to be... vague about.
public Temperature clone()
The method header looks great. You're returning a Temperature type, it's publicly accessible.
this.value = value;
this.scale = scale;
Do you know what the 'this' keyword does? It refers to the object that the method is called on. So, if I have a Temperature object 'a' and I want to call a.clone(), this will set a's value equal to... a's value.
return clone()
Here's the part that shows your big problem. What are you actually telling java to do here? You're telling it to return whatever the clone() method returns. Which means that clone will call itself, which will again call itself... on to stack overflow. This is a recursive loop that can't exit.
Remember, you want clone() to return a new Temperature object.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With