2017-02-02 2 views
0

Ich habe ein Problem, wo ich Object toString() -Methode überschreiben muss, aber die ursprüngliche Methode wirft keine Ausnahmen. Ich verwende jedoch einen generischen Code, für den Ausnahmen ausgelöst werden müssen.Java - overriding Objekt toString() -Methode, aber ich muss Ausnahmen auslösen

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(); 
} 

Dies ist ein Teil von FavoriteList.java. Diese Ausnahmen müssen geworfen werden. Wenn es irgendeine Möglichkeit gibt, diese Ausnahmen irgendwie zu unterdrücken oder sie in der Methode zu finden, wäre das hilfreich.

Am Ende meiner Methode Header hat wie folgt aussehen:

public String toString() 
{ content } 

ich über die Beendigung Inhalt des Verfahrens ist es egal. Solange es kompiliert, geht es mir gut. Ich muss nur die Kopfzeile reparieren, aber ich kann keine Lösung finden. Vielen Dank im Voraus.

+5

Es sieht so aus, als ob Sie bereits Ausnahmen mit diesem leeren Catch-Block unterdrücken, nicht wahr? Warum müssen sie * von 'toString()' geworfen werden? – David

+0

Ich habe versucht, sie mit diesem leeren Catch-Block zu unterdrücken, aber es funktioniert nicht. Wenn ich es entferne, muss ich nur die Ausnahmen EmptyList und InvalidPosition werfen. – JRoge

+1

Sieht aus wie 'fList.first()' diese Ausnahme auslöst, aber es ist nicht Teil des 'try/catch' Blocks ... warum? – Tom

Antwort

0

Erstens, Ausnahmen von toString() zu werfen ist eine wirklich schlechte Idee. toString() wird in vielen Systemsoftware (z. B. Debugger) verwendet, um die Darstellung des Objekts zu generieren.

Die erste Präferenz, etwas anderes zu tun wäre, erstellen Sie vielleicht eine andere Methode, die das Verfahren, und in toString() Anruf werfen kann, die Ausnahme abfangen und Ersatzausgang wie

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

Wenn Sie das Gefühl, dass produzieren Sie müssen wirklich werfen, können Sie dies tun:

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

Dies umschließt eine geprüfte Ausnahme (abgeleitet von java.lang.Ausnahme) in einer ungeprüften Ausnahme (abgeleitet von java.lang.RuntimeException). Keine Notwendigkeit, eine throws Klausel hinzuzufügen.

+0

Danke. Ihr zweiter Vorschlag hat funktioniert, mein Code wurde kompiliert. Vielen Dank! – JRoge

0

von den Ausnahmen zu urteilen, ich nehme es auf diese wird die Codezeile, die werfen könnte ?:

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

Wenn das der Fall ist, können Sie diese Ausnahme behandeln. Ich weiß nicht genau, was fList ist, und ich bin nicht genug vertraut mit Java, um zu wissen, ob der Compiler schlau genug ist zu wissen, dass Sie dafür überprüft haben, aber logisch, wenn die fList leer sein könnte dann würde ich überprüfen für den ersten:

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

Wenn der Compiler immer noch nicht gefällt, können Sie den gleichen Ansatz mit einem anderen versuchen/fangen. Etwas wie:

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

An diesem Punkt das Verfahren sollte wirklich nicht in der Lage sein, zu werfen, da jede Ausnahme in einfach Rückkehr eine leere Zeichenfolge führen würde. Daher sollte die Kopfzeile die aufgeführten Ausnahmetypen nicht benötigen.

Als eine persönliche Vorliebe würde ich empfehlen, etwas mit Ausnahme zu tun, wenn es gefangen wird. Mindestens Logging irgendwo, auch als Debug Log und nicht unbedingt ein Fehler. Eine generelle Ignorierung aller möglichen Ausnahmen ist auf lange Sicht nicht immer die beste Idee.

+0

Ich versuchte diese Ansätze, aber sie scheinen nicht zu funktionieren. Vielen Dank für Ihre Vorschläge! – JRoge

+0

@JRoge: Können Sie näher erläutern, was Sie versucht haben und wie es gescheitert ist? "Ich habe es versucht" und "Es scheint nicht zu funktionieren" sind keine sehr hilfreichen Beschreibungen des Problems. – David

+0

Ich habe versucht, eine if (fList.first() == null) werfen eine Ausnahme, und der Rest in den ELSE-Block, aber es hat nicht funktioniert. Ich versuchte einen anderen Ansatz mit einer Versuchs- und Fang-Anweisung, ähnlich wie bei Ihrem zweiten Vorschlag, und es funktionierte. Vielen Dank für Ihre Zeit! – JRoge

0

Sie können Ihren try Block außerhalb der for Schleife platzieren. Um die in fList.first() geworfene Ausnahme abzufangen.

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

Danke! Ich habe einen ähnlichen Ansatz versucht und es hat funktioniert. Ihre Eingabe wird geschätzt! – JRoge

Verwandte Themen