【问题标题】:How to print two seperate overridden toString messages如何打印两个单独的覆盖 toString 消息
【发布时间】:2016-04-13 03:47:31
【问题描述】:

在给定特定条件的情况下,有没有办法打印两个不同的覆盖 toString 消息?例如,下面是一个简单的示例,如果检查值为 0,我需要打印两条不同的错误消息。 我已覆盖 toString 以打印“错误:检查 = 0”,但我无法显示“错误:双值不精确”。

public class test{
public static void main(String[] args)
{
System.out.println(new Set(1,0)); // Should print "Error: Check = 0"
System.out.println(new Set(1,0).toDouble()); // Should print "Error: Double value not precise"
}
}

// ------------------------------------------
public class Set{
int a;
int check;

Fraction(int a, int check)
{
this.a = a;
this.check = check;
}
// ------------------------------------------
public String toString()
{
if(this.check == 0)
  return "Error: Check = 0";

return (this.a + ":" + this.check);
}
// ------------------------------------------
public double toDouble()
{
double number;

if(this.check != 0)
  number = ((a * check) + (1/3));
else
  number = 0;

return number;
}
// ------------------------------------------
public String toString(double d)
{
return ("" + d);
}
}

【问题讨论】:

  • 为什么不使用自定义异常呢!
  • “错误:双值不精确”的覆盖 toString() 位于何处?
  • 你不能这样做,因为你的 tostring 在第二个函数的情况下不会被调用,因为它返回 double
  • 我尝试添加一个 String toString(Double d) 方法,但它没有在 println 执行中被调用。 (顺便说一句,反对票是什么?)

标签: java double tostring println


【解决方案1】:

您的问题可能有多个答案。其中之一是使用您的“检查”标志作为错误的标识符。例如。您已经将值 0 解释为“错误:检查为 0”。同样,您可以分配值 -1 或其他值(假设 check 只是一个标志并且没有业务重要性。否则您可以定义一个专用标志变量来完成这项工作)。您可以根据您的特定条件分配此值 -1 以检查 toDouble 方法。然后,在 toString 方法中,首先检查 check 的值是否为 -1。如果为 -1,则显示“双值不精确”错误。否则,如果为 0,则显示“Check is 0”错误。如果我解释得不好,请告诉我。

【讨论】:

  • 我尝试通过向 Set 类添加一个布尔 double_check 变量来实现这种想法,并且在 toDouble 方法中触发了该变量。但我无法让它工作,因为系统没有为 println 语句调用我重写的 toString 方法。它甚至没有调用我重写的 toString(double d) 方法。
  • 哦,我明白了。您可以尝试将 toDouble 方法的返回类型从 double 更改为 Set 吗?之所以没有调用你的 toString 方法,是因为本例中的操作数对象是 Double 而不是 Set。
  • 你试过了吗?只需从 Set 类的 toDouble 方法返回一个新的 Set 实例。在新实例中,设置 -1 进行检查。然后在 toString 中,如果 check 为 -1,则显示“Double is not exact”错误。
  • 我需要零值,不能有另一个值作为标志。
【解决方案2】:

您尝试使用的toString() 是一个实例方法。每个类都可以声明自己的实例方法。这些实例方法不能被其他任何东西随意覆盖。在您的情况下,由于toDouble() 返回一个double 并且Java 会将其“自动装箱”到Double,因此您的println 将调用toString()Double 中定义的方法。 Java 中没有办法告诉它“用我选择的一种方法替换DoubletoString() 方法”。用double 参数声明toString() 肯定不行。

覆盖实例方法的唯一方法,例如这里的toString() 方法,是在子类中。如果Double 不是最终类,您可以定义自己的扩展DoubleMyDouble 子类,并覆盖MyDouble 中的toString() 方法。 但你也必须让 toDouble() 返回一个 MyDouble 而不是 Double double。然后你的println 会调用MyDouble toString,因为它有一个MyDouble 对象。获得覆盖实例方法的唯一方法是使用子类的对象,像这样。此覆盖不会toString() 更改为任何其他Double。 (但是,Double 被标记为final,因此您实际上无法定义自己的子类。)

【讨论】:

  • 好的,这是有道理的,我认为这就是我遇到的问题。当你说“Java 中没有办法[这样做]”时,我有点困惑,但是你在第二段中给出了关于如何做到这一点的说明。
  • 无法从 Set 类中覆盖 DoubletoString()
【解决方案3】:

检查一下

public double toDouble()
{
double number;

if(this.check != 0)
  number = ((a * check) + (1/3));
else
{number=0;
    System.out.println("Error: Double value not precise");}

return number;
}

【讨论】:

  • 我想在程序内部显示错误而不退出异常。
  • 所以也许用system.out.println("Error: Double value not precise")替换异常
  • 这可以将其打印到屏幕上,但出于我的目的,它会抢先打印出来。也就是说,我无法仔细控制它的输出时机。
  • 不可以控制,只有check等于0时才会打印
  • 是的,您可以控制 if 是否打印,但在执行 toDouble 方法时将始终打印。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多