2016-04-13 2 views
-3

Есть ли способ распечатать два разных переопределенных сообщения toString с учетом определенного условия? Например, следующий пример - это простой пример, когда мне нужно печатать два разных сообщения об ошибках, если значение проверки равно 0. Я переопределил toString, чтобы получить «Ошибка: Проверить = 0», но мне трудно отобразить « Ошибка: двойное значение неточно ».Как напечатать два отдельных переопределенных сообщения toString

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); 
} 
} 
+0

Почему бы не использовать пользовательское исключение, хотя! –

+1

Где находится переопределенная toString() с «Ошибка: двойное значение не точное»? –

+0

Вы не можете сделать это, потому что ваша строка не будет вызываться в случае второй функции, потому что она возвращает double – Alok

ответ

0

Может возникнуть несколько вопросов по вашей проблеме. Один из них - использовать ваш флаг «check» в качестве идентификатора ошибки. Например. вы уже интерпретируете значение 0 как «Ошибка: проверка равна 0». Аналогичным образом вы можете назначить значение -1 или что-то (если проверка является всего лишь флагом и не имеет бизнес-значимости. В противном случае вы можете определить выделенную переменную флага для выполнения этого задания). Вы можете назначить это значение -1 для проверки метода toDouble на основе вашего конкретного условия. Затем, в методе toString, сначала проверьте, имеет ли значение check значение -1. Если оно равно -1, отобразите ошибку «Двойное значение не точная». Если значение равно 0, отобразите ошибку «Проверка равна 0». Дайте мне знать, если я не очень хорошо объясню это.

+0

Я попытался реализовать такое мышление, добавив переменную Boolean double_check в класс Set, и я сработал переменную, когда внутри метода toDouble. Но я не мог заставить его работать, потому что система не вызывает мой переопределенный метод toString для инструкции println. Он даже не вызывает мой метод overrideen toString (double d). – Samuel

+0

О, я вижу.Можете ли вы попробовать изменить тип возвращаемого значения метода toDouble с двойным на Set? Причина, почему ваш метод toString не вызывается, заключается в том, что объект операнда в этом случае является Double и не установлен. – VHS

+0

Вы еще не попробовали? Просто верните новый экземпляр Set из вашего метода toDouble класса Set. В новом экземпляре установите -1 для проверки. А затем в toString, если проверка равна -1, отобразится ошибка «Двойная неточная точность». – VHS

0

Проверить это

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; 
} 
+0

Я хочу показать ошибку внутри программы, не выходя из исключения. – Samuel

+0

Так что, возможно, замените исключение на 'system.out.println (« Ошибка: двойное значение не точное »)' –

+0

Это будет работать, печатая его на экране, но оно печатает его превентивно для моих целей. Другими словами, я не могу тщательно контролировать время его выхода. – Samuel

0

toString() вы пытаетесь использовать метод экземпляр. Каждый класс может объявить свои собственные методы экземпляра. Эти методы экземпляра не могут быть переопределены по желанию другими. В вашем случае, начиная с toDouble(), возвращается double, и Java будет «автоматически устанавливать» это на Double, ваш println вызовет метод toString(), определенный в Double. На Java нет способа сказать «заменить DoubletoString() с одним из моих вариантов». Объявление toString() с параметром double определенно не сделает этого.

Единственный способ переопределить метод экземпляра, например метод toString(), находится в подклассе. Если Double не были последним классом, вы можете определить свой собственный подкласс MyDouble, который расширяет Double и переопределяет метод toString() в MyDouble. Но вы также должны сделатьtoDouble()возвращающиеMyDoubleвместоDoubleилиdouble. Тогда ваш println позвонит MyDoubletoString, так как он имеет объект MyDouble. Единственный способ получить метод переопределения экземпляра - это объект подкласса, например. Это переопределение будет не изменение toString() для любых других Double. (Однако Double отмечен как final, поэтому вы не можете определить свой собственный подкласс.)

+0

OK, это имеет смысл, и я думаю, что это проблема, с которой я сталкиваюсь. Я просто немного смущен, когда вы говорите: «В Java нет никакого способа сделать это», но тогда вы, во втором абзаце, даете указания о способе сделать это. – Samuel

+0

Невозможно переопределить 'toString()' Double' из вашего класса 'Set'. – ajb