2017-02-02 4 views
0

У меня возникла проблема, когда мне нужно переопределить метод Object toString(), но исходный метод не генерирует никаких исключений. Однако я использую какой-то общий код, который требует исключения.Java - переопределение метода Object toString(), но я должен исключать исключения

public String toString() throws EmptyListException, InvalidPositionException 
{ 
    Position<Entry<E>> current = fList.first(); 
    StringBuilder str = new StringBuilder(); 
    for(int i = 0; i < size(); i++) 
    { 
     try 
     { 
      str.insert(str.length(), current.element().toString() + " "); 
      current = fList.next(current); 
     } 
     catch(Exception e){} 
    } 
    return str.toString(); 
} 

Это часть каталога FavoriteList.java. Эти исключения нужно бросить. Если есть какой-либо способ подавить эти исключения или поймать их внутри метода, это будет полезно.

В конце концов, мой заголовок метода должен выглядеть следующим образом:

public String toString() 
{ content } 

Я не забочусь о закончившемся содержании метода. Пока он компилируется, я в порядке. Мне просто нужно исправить заголовок, но я не могу найти способ его исправить. Спасибо вам большое заблаговременно.

+5

Похоже, вы уже подавляете исключения из этого пустого блока catch, не так ли? Почему они * имеют *, чтобы быть брошенными 'toString()'? – David

+0

Я пытался подавить их с помощью пустого блока catch, но он не работает. Если я удалю его, мне просто придется выбросить исключения EmptyList и InvalidPosition. – JRoge

+1

Похож, что 'fList.first()' выбрасывает это исключение, но оно не является частью блока 'try/catch' ... почему? – Tom

ответ

0

Во-первых, исключение исключений из toString() - очень плохая идея. toString() используется во множестве системного программного обеспечения (например, отладчика) для генерации представления объекта.

Первое предпочтение было бы сделать что-то еще, возможно создать другой метод, который может бросить, и в toString() вызова, метод, поймать исключение и производить вывод замены, такие как

super().toString() + " threw " + exception.toString(); 

Если вы чувствуете, что вы действительно должны бросить, вы можете это сделать:

try 
    { 
     str.insert(str.length(), current.element().toString() + " "); 
     current = fList.next(current); 
    } 
    catch(Exception e){ 
     throw new IllegalStateExcception(super.toString(), e); 
    } 

Это обертывает проверенное исключение (полученное из java.lang.Исключение) в неконтролируемом исключении (полученное из java.lang.RuntimeException). Не нужно добавлять предложение throws.

+0

Спасибо. Ваше второе предложение сработало, мой код скомпилирован. Большое спасибо! – JRoge

0

Судя по исключениям, я беру его это мешающая линия, которая может бросить ?:

Position<Entry<E>> current = fList.first(); 

Если это так, вы можете справиться с этим исключением. Я не знаю точно, что такое fList, и я недостаточно знаком с Java, чтобы узнать, будет ли компилятор достаточно умен, чтобы знать, что вы его проверили, но логически, если fList может быть пустым, тогда я бы проверил для этого первый:

if (/* check for an empty or null fList */) { 
    return ""; 
} 
// the rest of your code 

Если компилятор все еще не нравится, что вы можете взять в значительной степени тот же подход, с другой TRY/улова. Что-то вроде:

try { 
    // the rest of your code 
} catch (Exception e) { 
    return ""; 
} 

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

Что касается личных предпочтений, я бы порекомендовал что-то, за исключением случаев, когда он пойман. По крайней мере, зарегистрировать его где-нибудь, даже как журнал отладки, а не обязательно ошибку. Оплотное игнорирование во всех возможных исключениях не всегда является лучшим из идей в долгосрочной перспективе.

+0

Я пробовал эти подходы, но они, похоже, не работают. Спасибо за ваши предложения! – JRoge

+0

@JRoge: Можете ли вы рассказать о том, что вы пробовали и как это не удалось? «Я пробовал» и «кажется, что не работает», не очень полезные описания проблемы. – David

+0

Я попытался поместить if (fList.first() == null), выбросив исключение, а остальное в блок ELSE, но это не сработало. Я попробовал другой подход с предложением try and catch, похожим на ваше второе предложение, и это сработало. Спасибо вам большое за ваше время! – JRoge

0

Вы можете разместить свой try блок вне цикла for. Чтобы поймать исключение, брошенное в fList.first().

public String toString() throws EmptyListException, InvalidPositionException 
{ 
    try 
    { 
     Position<Entry<E>> current = fList.first(); 
     StringBuilder str = new StringBuilder(); 
     for(int i = 0; i < size(); i++) 
     { 
      str.insert(str.length(), current.element().toString() + " "); 
      current = fList.next(current); 
     } 
    } 
    catch(Exception e){} 
    return str.toString(); 
} 
+0

Спасибо! Я пробовал аналогичный подход, и он сработал. Ваш вход оценен! – JRoge

Смежные вопросы