2016-04-03 22 views
1

私はFileNameEceptionシングルトンのJavaから例外を処理する方法は?

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 SingletonText { 
private static final CompositeText text = new CompositeText(new TextReader("text/text.txt").readFile()); 

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

としたTextReaderコンストラクタはどのように私はそれがメインに再スローすることができますし、そこにそれをキャッチ持っていますか? メインクラス

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を宣言する必要があり、それは、マルチスレッドのアプリケーション場合は、ダブルチェックロックを使用して新しい文を​​する必要があります。 https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java お楽しみください。

+0

ジュスタ小さな修正:変数は、このアプローチでは、 'final'することはできません。 – dambros

+0

あなたは正しいです。それを固定した。 – chico

+0

これを行わないでください。 SingletongTextはもはやスレッドセーフではありません。 –

0

シングルトンの静的初期化子が失敗すると、java.lang.ExceptionInInitializerErrorが表示されます。

原因として、あなたのFileNameExceptionがあります。

何もしないと、デフォルト例外ハンドラはスタックトレース全体を標準エラーに出力します。

1

静的ブロックは、クラスが初めてロードされたときにのみ実行されるため、例外を再スローすることができる以下のようなものを持つことができます。あなたのメインの方法では、try-catchブロックにgetInstance()呼び出しを囲み、次にcatchにはあなたが探しているものを何でもすることができます。

例外が発生した場合、この例外はスローされ、(静的ブロックから)スローされます。クラスロード時に1回だけスローされます。 @Alexander Pogrebnyakが言ったこともまた真実です。

あなたが常にtext/text.txtファイルを読んでいるので、あなたが提供したコードを見ると、以下のアプローチが有効です。あなたが別のファイルを読んでから例外を再投げようとしているのであれば、それはまったく別の話になります。それはあなたが探しているものだ場合どのような場合には、:

  • あなたCompositeTextクラスのシングルトンオブジェクトを作成する必要があります。
  • セッターメソッドを作成すると、渡されたファイル名文字列を使用してオブジェクトTextReaderクラスが作成されます。
  • そのセッターメソッドは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; 
    } 
} 
関連する問題