我想创建一个只有静态函数的类。我还需要在调用类函数之前初始化某些变量。由于我只使用静态函数,因此无法使用构造函数来执行此操作。
所以现在当我尝试以下面的方式设置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); }
但现在我无法做到这一点吗?
答案 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);
}