【问题标题】:Setting attributes/instance variables and printing in toString()设置属性/实例变量并在 toString() 中打印
【发布时间】:2017-09-15 21:28:33
【问题描述】:

我必须返回三角形的面积和周长。我在主文件中创建了 2 个函数。 这是我的toString() 函数:

public String toString()
   {
      String printPerimeter = "The perimiter is " + perimeter;
      String printArea = "The area is " + area;
      return printPerimeter;
      return printArea;
   }

然后我将该代码上方的周长和面积设置为:

private double area;
private double perimeter;

我的 setter 函数:

public double setPerimiter()
   {
      perimeter = (sideA + sideB + sideC);
      return perimeter;
   }

   public double setArea()
   {
      double s = (sideA+sideB+sideC)/2.0;
      area = Math.sqrt(s*((s-sideA)*(s-sideB)*(s-sideC)));
      return area;
   }

我确定我退货的方式有问题。但它一直在说Triangle.java:52: error: unreachable statement 对行

  return printPerimeter;
  return printArea;

有什么帮助吗?

【问题讨论】:

  • 你不能那样做。第二条语句return printArea; 永远不会执行。我认为您希望 return printPerimeter + printArea 获得 toString() 返回值。
  • 不相关,但是为什么setter不带参数并返回值?尽管设置了类变量,但对我来说似乎更像吸气剂

标签: java return


【解决方案1】:

一个函数只能返回一个语句。

public String toString()
  {
  String printPerimeter = "The perimiter is " + perimeter;
  String printArea = "The area is " + area;

  return printPerimeter; <-- This will be returned

  return printArea; <-- Program control will never reach here 
and hence you are getting the error "unreachable code"

 }

类似于两个setter,你需要有两个getter:

public String getPermiter()
{
  String printPerimeter = "The perimiter is " + perimeter;
  return printPerimeter;
  }


public String getArea()
{
  String printArea = "The area is " + area;
  return printArea;
}

【讨论】:

    【解决方案2】:

    连接两个字符串(见@Aominè 评论):

    return printPerimeter + printArea;
    

    或者把两个字符串放在一个数组中,然后返回数组:

    String[] dimens = new String[2];
    dimens[0] = printPerimeter;
    dimens[1] = printArea;
    return dimens;
    

    或者拆分成toStringPerimeter()和toStringArea()两种方法。

    【讨论】:

    • 1+ 对于第一个解决方案,但我不会创建一个数组来存储两个对象。似乎没有必要,并且会导致开销。此外,如果 OP 采用这种方法 return dimens; 将失败,因为它是字符串数组而不是 String。
    • 没错,我只是假设 OP 会将方法声明中的返回类型更改为 String[]。
    • 好吧,我明白了,但即便如此,toString 的定义是它返回 对象的字符串表示,而不是字符串数组或任何其他类型。
    • @Aominè 我同意你的观点,也许该方法最好称为 toStringArray() 或类似的东西。我猜想 OP 需要单独的周长和面积字符串是有原因的,使用数组可以提供这种灵活性。两种不同的方法也是如此。取决于 OP 的需求。
    【解决方案3】:

    正如其他人所说,您只能有一个退货声明。所以这是另一种将两个输出合并为一个的替代实现

       public String toString()
       {
          StringBuilder sbuilder = new StringBuilder("The perimiter is");
          sbuilder.append(perimeter);
          sbuilder.append("\n");
          sbuilder.append("The area is ");
          sbuilder.append(area);
          return sbuilder.toString();
       }
    

    【讨论】:

    • 1+ 是一个有效的解决方案,但出于好奇,使用 StringBuilder 而不是 String 的任何具体原因?通常,在循环中连接字符串时,您更喜欢StringBuilder 而不是String。
    【解决方案4】:

    当 return 调用它意味着它是一个方法的结束,换句话说,你的第二个 return 语句将永远不会发生。在这种情况下,当您实现 toString 方法时,您应该将两条消息作为一个字符串返回。

    public String toString() {
        return "The perimiter is " + perimeter + "\nThe area is " + area;
    }
    

    或者你可以使用 StringBuilder

    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("The perimeter is ").append(perimeter);
        sb.append("\n");
        sb.append("The area is ").append(area);
    
        return sb.toString();
    }
    

    如果您想通过某种方法获得 2 个不同的对象,则需要将其包装在某个包装器中,它允许您稍后解包它。例如,它可以是 String[] 或一些集合,甚至是一些自定义类 TwoString,它声明了 2 个 String 字段。 列表示例

    public List<String> getToStrings() {
        List<String> result = new ArrayList<>();
        result.add("The perimiter is " + perimeter);
        result.add("The area is " + area);
    
        return result;
    }
    

    但它不会像 toString() 那样工作,它只是一个如何返回“多于 1 个对象”的示例。

    【讨论】:

      【解决方案5】:

      你 can only have 1 return 声明。第二个将无法访问。

      【讨论】:

        猜你喜欢
        • 2011-06-16
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 2017-04-11
        • 2018-08-04
        • 1970-01-01
        • 2016-08-22
        • 2017-11-09
        相关资源
        最近更新 更多