2016-04-03 9 views
1

Ich habe eine SingletonklasseWie behandelt man die Ausnahme von Singleton Java?

public class SingletonText { 
private static final CompositeText text = new CompositeText(new TextReader("text/text.txt").readFile()); 

public SingletonText() {} 
public static CompositeText getInstance() { 
    return text; 
}} 

und Textreader Konstruktor, der es FileNameEception

public TextReader(String filename) throws FileNameException{ 
    if(!filename.matches("[A-Za-z0-9]*\\.txt")) 
     throw new FileNameException("Wrong file name!"); 

    file = new File(filename); 
} 

Wie kann ich erneut auslösen es zu Haupt- und fangen dort werfen könnte?

Hauptklasse
public class TextRunner { 

public static void main(String[] args) { 
    // write your code here 
    SingletonText.getInstance().parse(); 

    System.out.println("Parsed text:\n"); 
    SingletonText.getInstance().print(); 

    System.out.println("\n\n(Var8)Task1:"); 
    SortWords.sortWords(SingletonText.getInstance().getText().toString(), "^[AEIOUaeiou].*", new FirstLetterComparator()); 
    System.out.println("\n\n(Var9)Task2:"); 
    SortWords.sortWords(SingletonText.getInstance().getText().toString(), "^[A-Za-z].*", new LetterColComparator()); 
    System.out.println("\n\n(Var16)Task3:"); 
    String result = SubStringReplace.replace(SingletonText.getInstance() 
      .searchSentence(".*IfElseDemo.*"), 3, "EPAM"); 
    System.out.println(result); 
}} 

Antwort

0

Versuch zu faul initialze Singleton. etwas wie folgt aus:

public class SingletonText { 
private static CompositeText text; 

public SingletonText() { 
} 

public static CompositeText getInstance() { 
    if (text ==null) { 
     text = new CompositeText(new TextReader("text/text.txt").readFile()); 
    } 
    return text; 
} 
} 

Außerdem müssen Sie den Konstruktor private, zu erklären, und wenn es Multi-Threaded-Anwendung müssen Sie die neue Anweisung mit Doppelrückschlag Verriegelung synchronized. sehen dies in wiki: https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java Genießen ..

+0

Justa kleine Korrektur: die Variable nicht 'final' in diesem Ansatz sein kann. – dambros

+0

Sie haben Recht. behoben. – chico

+0

Tun Sie das nicht. SingletongText ist nicht mehr Thread-sicher. –

0

Sie java.lang.ExceptionInInitializerError erhalten, wenn Ihre Singleton statische Initialisierer fehl.

Als Ursache wird es Ihre FileNameException haben.

Wenn Sie nichts tun, druckt der Standardausnahmebehandler den gesamten Stack-Trace auf den Standardfehler.

1

Der statische Block wird nur ausgeführt, wenn die Klasse zum ersten Mal geladen wird. Sie können also etwas wie unten haben, mit dem Sie die Ausnahme erneut werfen können. In Ihrer Hauptmethode umgeben Sie getInstance() Aufruf in einem try-catch Block und dann in catch können Sie tun, was auch immer Sie suchen.

Im Ausnahmefall wird diese Ausnahme zum Zeitpunkt des Ladens der Klasse nur einmal ausgelöst und erneut ausgelöst (von Ihrem statischen Block). Was @Alexander Pogrebnyak gesagt hat, ist auch wahr.

Blick auf den Code, den Sie zur Verfügung gestellt haben, da Sie immer lesen text/text.txt Dateien so unten Ansatz funktioniert. Für den Fall, dass Sie verschiedene Dateien lesen und dann die Ausnahme erneut werfen, wird das alles zu einer anderen Geschichte, und Sie haben diesen Teil nicht gefragt, auch der von Ihnen bereitgestellte Code zeigt dasselbe. In jedem Fall ist, wenn das, was Sie suchen dann:

  • Sie benötigen ein Singleton-Objekt Ihrer CompositeText Klasse zu erstellen.
  • Erstellen Sie eine Setter-Methode erstellt ein Objekt TextReader Klasse mit dem Dateinamen Zeichenfolge übergeben.
  • diese Setter-Methode wird die try-catch Block haben, und in der catch Block werden Sie die Ausnahme erneut werfen, so dass Sie wieder in main Methode fangen können.

PS: da statische Blöcke nur einmal ausgeführt werden, wenn Klasse geladen und Klasse wird nur einmal pro JVM geladen (bis Sie benutzerdefinierte Klasse Ladern und überschreibt das Verhalten haben), so ist sichergestellt, dass diese Singleton ist Gewinde- sicher.

Code:

public class SingletonText {  
    private static CompositeText text = null; 

    static{ 
     try { 
      text = new CompositeText(new TextReader("text/text.txt").readFile()); 
     } catch (FileNameException e) { 
      // TODO: re-throw whatever you want 
     } 
    } 
    public SingletonText() {} 
    public static CompositeText getInstance() { 
     return text; 
    } 
} 
Verwandte Themen