如何在仅使用静态函数的类中初始化时捕获错误

时间:2017-01-12 20:57:36

标签: java junit static-methods

我想创建一个只有静态函数的类。我还需要在调用类函数之前初始化某些变量。由于我只使用静态函数,因此无法使用构造函数来执行此操作。

所以现在当我尝试以下面的方式设置SSLContext时,我收到一个错误:未处理的异常类型NoSuchAlgorithmException。我该怎么做呢?我可以在setContext函数中放置一个try catch,并将值设置为null,包含错误。如果我注意到某个上下文变量为null的地方,我会从我的一个函数中抛出一个错误。

public class HTTPRequest {
    private static SSLContext context = setContext();
    private static SSLContext setContext() throws NoSuchAlgorithmException    {
        return SSLContext.getInstance("TLSv1.2");
    }
}

具体来说,在编写JUnit测试用例时会有什么影响: 假设,在测试时我想通过我的模拟算法?通常我会通过构造函数设置这些值。通过以下方式:HTTPRequest(String algo) { context =SSLContext.getInstance(algo); }但现在我无法做到这一点吗?

5 个答案:

答案 0 :(得分:1)

捕获异常并抛出未经检查的异常(例如RuntimeException)。

private static SSLContext setContext() {
    try {
        return SSLContext.getInstance("TLSv1.2");
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    }
}

答案 1 :(得分:1)

您可以创建静态init()方法,其他静态方法在运行之前将调用该方法。

private static void init() { .. }

public static void doSomething() {
  init();
  // do the thing
}

您还可以使该类非静态,并通过单例实例访问它:

public class HTTPRequest {
  public static HTTPRequest getInstance() { ... }
}

然后,您可以正常使用构造函数。

答案 2 :(得分:1)

@ Kayaman的答案是完全正确的,但我也可以建议你使用静态块来初始化静态变量 - 它减少了代码量:

public class HTTPRequest {
    private static SSLContext context;

    static {
        try {
            context = SSLContext.getInstance("TLSv1.2")
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
}

答案 3 :(得分:1)

  

我想创建一个只有静态函数的类。

Java没有功能,只有方法

  

我还需要在调用类函数之前初始化某些变量。由于我只使用静态函数,因此无法使用构造函数来执行此操作。

怎么样?也就是说,在类中使用普通方法和实例变量。事实上,如果你遇到麻烦,可能会被解释为你应该走另一个方向的迹象。

然而,如果你坚持,你可以这样做。您需要的主要工具是静态初始化程序块。这样的块可以包含或多或少的任意代码来初始化类的静态成员。例如:

public class HTTPRequest {
    private static SSLContext context;

    static {
        try {
            context = setContext();
        } catch (NoSuchAlgorithmException nsae) {
            throw new RuntimeException(nsae);
            // or maybe just eat it, but that would leave context null
        }
    }

    private static SSLContext setContext() throws NoSuchAlgorithmException    {
        return SSLContext.getInstance("TLSv1.2");
    }
}

特别注意,您可以捕获初始化程序块中的异常,并且可以抛出未经检查的异常。如果这样的初始化程序确实抛出了未经检查的异常,那么加载该类(或者实际初始化它)将导致抛出ExceptionInInitializerError

答案 4 :(得分:1)

  

我可以在setContext中放一个try catch   函数并将值设置为null,包含错误。如果我   注意上下文变量为null的地方,我抛出一个错误   从我的一个职能。

遇到异常后,您应该立即处理问题。如果您忘记在任何地方处理它,这可以避免副作用。

  

所以现在当我尝试以下面的方式设置SSLContext时,我得到了   错误:未处理的异常类型NoSuchAlgorithmException。怎么样   我应该接近这个吗?

您有三种方法来解决问题:

  • 如果异常应该停止处理,并且在抛出NoSuchAlgorithmException时应该显示或执行特定处理,则应捕获异常并抛出自定义RuntimeException,例如{ {1}}:

    NoSuchAlgorithmRunTimeException

通过这种方式,您可以了解如何从呼叫方处理它。您只需要抓住try { return SSLContext.getInstance("TLSv1.2"); } catch (NoSuchAlgorithmException e) { throw new NoSuchAlgorithmRunTimeException(e); }

  • 如果异常应该停止处理并且在抛出NoSuchAlgorithmRunTimeException时不应该执行特定处理,那么抛出Kayaman建议的通用NoSuchAlgorithmException就足够了:

    RuntimeException

  • 如果异常应该被忽略,因为异常不应该阻止应用程序继续工作,只需捕获它并使用您认为正确的日志级别进行记录。

    try { return SSLContext.getInstance("TLSv1.2"); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); }