Почему я не могу вернуть значение строкового типа в методе toString?

Я пытаюсь написать метод 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+")"; 

    }
  }


}

Локальные переменные всегда должны быть инициализированы. В вашем примере, если часть else никогда не выполняется, строки вообще не будут инициализированы.

Chetan Kinger 28.04.2019 06:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
353
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В типах переменных нет ничего плохого, но они не должны быть нулевыми. Инициализируйте s1, s2 и s3 пустой строкой в ​​начале вашего метода toString. Кроме того, вместо того, чтобы устанавливать для них значение null, установите для них пустую строку, где вы не получите подходящего значения для x, y или z.

Вместо:

String s1, s2, s3;

использовать:

String s1 = "", s2 = "", s3 = "";

Кроме того, я бы не стал использовать условные блоки, в которых вы устанавливаете одну из строк в null, поскольку их инициализация пустой строкой делает эту операцию избыточной. Поместите ! перед каждым из их условий и добавьте их к блокам, которые устанавливают для строки другое значение.

Другие вопросы по теме