2016-04-03 2 views
1

У меня есть одноэлементный классКак справиться с исключением из 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; 
}} 

И TextReader конструктор, который может бросить 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); 
} 

Как я могу повторно выдать его основной и поймать его там? Основной класс

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

ответ

0

пытаются ленивым initialze синглтона. что-то вроде этого:

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

Кроме того, вы должны объявить конструктор private, и если это многопоточное приложение, которое необходимо synchronized новое заявление с двойным обратным замком. увидеть это в вики: https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java Наслаждайтесь ..

+0

Хуста небольшая коррекция: переменная не может быть 'final' в этом подходе. – dambros

+0

Вы правы. починил это. – chico

+0

Не делайте этого. SingletongText перестает быть потокобезопасным. –

0

вы получите java.lang.ExceptionInInitializerError, когда ваш одноточечно статический инициализатор потерпит неудачу.

В качестве причины у него будет FileNameException.

Если вы ничего не сделаете, обработчик исключений по умолчанию распечатает всю трассировку стека до стандартной ошибки.

1

Статический блок выполняется только в том случае, если класс загружен в первый раз, поэтому вы можете иметь что-то ниже, что позволит вам повторно выбросить исключение. В вашем основном методе вы будете окружать getInstance() вызов в блоке try-catch, а затем в catch вы можете делать все, что вы ищете.

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

Глядя на код, который вы предоставили, поскольку вы всегда читаете text/text.txt файлы, так что под подход будет работать. Если вы хотите читать разные файлы, а затем перебрасывать исключение, то это становится все вместе другой историей, и вы не просили эту часть, ни код, который вы предоставили, не показывает то же самое. В любом случае, если это то, что вы ищете, то:

  • вам нужно создать одноэлементный объект вашего CompositeText класса.
  • создать метод сеттера создаст объект TextReader класс, используя переданную строку имени файла.
  • , что метод setter будет иметь блок try-catch, а в блоке catch вы будете повторно выбрасывать исключение, чтобы вы снова могли поймать метод main.

PS: поскольку статические блоки выполняются только один раз, когда класс загружен и класс загружаются только один раз в JVM (пока у вас есть пользовательские загрузчики классов и переопределение поведения), так что это гарантирует, что Синглтон резьбовой безопасно.

Код:

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; 
    } 
} 
Смежные вопросы