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

Java 如何在仅使用静态函数的类中初始化时捕获错误,java,junit,static-methods,Java,Junit,Static Methods,我想创建一个只有静态函数的类。在调用类函数之前,我还需要初始化某些变量。由于我只使用静态函数,所以我不能使用构造函数来完成它 因此,现在当我尝试以以下方式设置SSLContext时,我得到一个错误:未处理的异常类型NoSuchAlgorithmException。我应该如何处理这个问题?我可以在setContext函数中放置一个try-catch,并将该值设置为null,以防出现错误。如果我注意到上下文变量为null,我会从我的函数中抛出一个错误 public class HTTPRequest

我想创建一个只有静态函数的类。在调用类函数之前,我还需要初始化某些变量。由于我只使用静态函数,所以我不能使用构造函数来完成它

因此,现在当我尝试以以下方式设置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);}
但现在我无法正确执行此操作了?

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


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


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

private static void init() { .. }

public static void doSomething() {
  init();
  // do the thing
}
您还可以使类成为非静态的,并通过单例实例访问它:

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

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

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

private static void init() { .. }

public static void doSomething() {
  init();
  // do the thing
}
您还可以使类成为非静态的,并通过单例实例访问它:

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

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

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

public class HTTPRequest {
    private static SSLContext context;

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

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

public class HTTPRequest {
    private static SSLContext context;

    static {
        try {
            context = SSLContext.getInstance("TLSv1.2")
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
}
我想创建一个只有静态函数的类

public class HTTPRequest {
    private static SSLContext context = setContext();
    private static SSLContext setContext() throws NoSuchAlgorithmException    {
        return SSLContext.getInstance("TLSv1.2");
    }
}
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");
    }
}
请特别注意,您可以捕获初始值设定项块内的异常,并且可以抛出未经检查的异常。如果这样的初始值设定项确实引发未经检查的异常,则加载类(或对其进行初始化)将导致引发
异常InInitializeRerror

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

public class HTTPRequest {
    private static SSLContext context = setContext();
    private static SSLContext setContext() throws NoSuchAlgorithmException    {
        return SSLContext.getInstance("TLSv1.2");
    }
}
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");
    }
}
请特别注意,您可以捕获初始值设定项块内的异常,并且可以抛出未经检查的异常。如果这样的初始值设定项确实引发未经检查的异常,则加载类(或对其进行初始化)将导致引发
异常InInitializeRerror

我可以在setContext中放置一个try-catch 函数,并将该值设置为null,以防出现错误。如果我 注意上下文变量为null,我抛出了一个错误 从我的一个功能

public class HTTPRequest {
    private static SSLContext context = setContext();
    private static SSLContext setContext() throws NoSuchAlgorithmException    {
        return SSLContext.getInstance("TLSv1.2");
    }
}
您应该在遇到异常时立即处理该问题。这避免了副作用,如果你忘记处理它无处不在

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

您有三种处理问题的方法:

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

    试试看{
    返回SSLContext.getInstance(“TLSv1.2”);
    }捕获(无算法异常){
    抛出新的NoSuchAlgorithmRunTimeException(e);
    }

这样,您就知道如何从调用方处理它。您只需要捕获
NoSuchAlgorithmRunTimeException

  • 如果异常应该停止处理,并且在抛出
    nosuchagorithmexception
    时不应该执行特定的处理,那么按照Kayaman的建议抛出一个泛型
    运行时异常就足够了:

    试试看{
    返回SSLContext.getInstance(“TLSv1.2”);
    }捕获(无算法异常){
    抛出新的运行时异常(e);
    }

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

    试试看{
    返回SSLContext.getInstance(“TLSv1.2”)