Я пытаюсь написать метод toString для объекта с именем ThreeDVector, который может распечатать трехмерный вектор с точки зрения i, j и k, например «-2i+3.8k-j» или «7i-5j». Однако в строке 96 всегда возникает ошибка, в которой говорится, что s1, s2 и s3, возможно, не были инициализированы. Поскольку я уже инициализировал его, я предполагаю, что что-то не так с типом этих переменных, но я не понимаю, как это исправить.
class ThreeDVector
{
double x; // x-component of vector
double y; // y-component of vector
private double z; // z-component of vector
// For the purposes of this lab the z component must be between -1000
// and 1000 (non-inclusive).
public ThreeDVector(){
x=0;
y=0;
z=0;
}
public ThreeDVector(double x, double y, double z)
{
this.x = x;
this.y = y;
if (z>(-1000)&&z<(1000))
this.z = z;
else{
throw new RuntimeException();
}
}
public void setZvalue(double z) throws Exception
{
if ( z>(-1000)&&z<1000 )
this.z= z;
else{
throw new Exception("z value has to be in the range of -1000 to 1000, non-inclusve");
}
}
public boolean isWholenum (double n){
if (Math.round(n) == n)
return true;
else
return false;
}
public String toString(){
String s1, s2, s3;
if (this.z>=1000||z<=(-1000)){
return "undefied";
}else{
if (x!=0){
if (isWholenum(x)==true){
s1=String.valueOf(Math.round(x))+"i";
}else{
s1=String.valueOf(String.format("%.3f", x))+"i";
}
}else if (x==0)
s1=null;//if the coefficient is 0, do not print out that term
if (y>0){
if (isWholenum(y)==true){
s2 = "+"+String.valueOf(Math.round(y))+"j";
}else{
s2 = "+"+String.valueOf(String.format("%.3f", y))+"j";
}
}
else if (y==0)
s2=null;
else if (y<0){
if (isWholenum(y)==true){
s2 = "-"+String.valueOf(Math.round(y))+"j";
}else{
s2 = "-"+String.valueOf(String.format("%.3f", y))+"j";
}
}
if (z>0){
if (isWholenum(z)==true){
s3 = "+"+String.valueOf(Math.round(z))+"k";
}else{
s3 = "+"+String.valueOf(String.format("%.3f", y))+"k";
}
}
else if (z==0)
s3=null;
else if (z<0){
if (isWholenum(z)==true){
s3 = "-"+String.valueOf(Math.round(z))+"k";
}else{
s3 = "-"+String.valueOf(String.format("%.3f", z))+"k";
}
}
return "("+ s1+s2+ s3+")";
}
}
}




В типах переменных нет ничего плохого, но они не должны быть нулевыми. Инициализируйте s1, s2 и s3 пустой строкой в начале вашего метода toString. Кроме того, вместо того, чтобы устанавливать для них значение null, установите для них пустую строку, где вы не получите подходящего значения для x, y или z.
Вместо:
String s1, s2, s3;
использовать:
String s1 = "", s2 = "", s3 = "";
Кроме того, я бы не стал использовать условные блоки, в которых вы устанавливаете одну из строк в null, поскольку их инициализация пустой строкой делает эту операцию избыточной. Поместите ! перед каждым из их условий и добавьте их к блокам, которые устанавливают для строки другое значение.
Локальные переменные всегда должны быть инициализированы. В вашем примере, если часть else никогда не выполняется, строки вообще не будут инициализированы.