调用在其他类中引发异常的方法

时间:2014-02-05 03:28:44

标签: java exception-handling constructor singleton private

我有以下代码,我懒得加载我的类的实例创建。

public class MyTest {
private static MyTest test = null;
private UniApp uniApp;  

private MyTest(){
    try{                        
        uniApp = new UniApp("test","test123");          
    }
    catch(Exception e){
        e.printStackTrace();
        logger.error("Exception " +e+ "occured while creating instance of uniApp");
    }   
}

public static MyTest getInstance(){
    if (test == null){
        synchronized(MyTest.class){
            if (test == null){
                test = new MyTest();
            }
        }
    }
    return test;
}

在构造函数中,我创建了一个UniApp实例,需要在自己的构造函数中传递userid,password。如果我说我传递了一个错误的userid,uniApp对象的密码,则不会创建uniApp。这就是我需要的 -

我在另一个类中调用getInstance方法 -

    MyTest test=MyTest.getInstance();

在这里,如果发生uniApp创建失败,我想添加条件,做吧。我怎么做? 一般来说,如果我试图调用一个在类B中抛出A类异常的方法,并在B中放入一个条件 - 如果A类中的方法抛出异常,那就这样做。

我怎样才能做到这一点?如果我的问题令人困惑,请告诉我。我可以编辑它:)

1 个答案:

答案 0 :(得分:2)

从私有构造函数中抛出异常就可以了(引用This SO question,或者做一些快速的Google搜索)。在您的情况下,您正在捕获从new UniApp()抛出的异常并且不传递它 - 您可以非常轻松地将该异常从食物链传递到您的getInstance()方法,然后传递给任何调用该单例的人。

例如,使用您的代码:

private MyTest() throws UniAppException { // Better if you declare _which_ exception UniApp throws!
    // If you want your own code to log what happens, keep the try/catch but rethrow it
    try{                        
        uniApp = new UniApp("test","test123");          
    }
    catch(UniAppException e) {
        e.printStackTrace();
        logger.error("Exception " +e+ "occured while creating instance of uniApp");
        throw e;
    }   
}

public static MyTest getInstance() throws UniAppException {
    if (test == null) {
        synchronized(MyTest.class) {
            if (test == null) {
                test = new MyTest();
            }
        }
    }
    return test;
}

要创建“if”条件以测试getInstance()方法是否有效,请使用try / catch块围绕您对getInstance()的调用:

...
MyTest myTest;
try {
    myTest = MyTest.getInstance();
    // do stuff with an instantiated myTest
catch (UniAppException e) {
    // do stuff to handle e when myTest will be null
}
...

由于您没有显示实际调用MyTest.getInstance(),我无法告诉您除此之外还有什么可做。