Java 如何在仅使用静态函数的类中初始化时捕获错误
我想创建一个只有静态函数的类。在调用类函数之前,我还需要初始化某些变量。由于我只使用静态函数,所以我不能使用构造函数来完成它 因此,现在当我尝试以以下方式设置SSLContext时,我得到一个错误:未处理的异常类型NoSuchAlgorithmException。我应该如何处理这个问题?我可以在setContext函数中放置一个try-catch,并将该值设置为null,以防出现错误。如果我注意到上下文变量为null,我会从我的函数中抛出一个错误Java 如何在仅使用静态函数的类中初始化时捕获错误,java,junit,static-methods,Java,Junit,Static Methods,我想创建一个只有静态函数的类。在调用类函数之前,我还需要初始化某些变量。由于我只使用静态函数,所以我不能使用构造函数来完成它 因此,现在当我尝试以以下方式设置SSLContext时,我得到一个错误:未处理的异常类型NoSuchAlgorithmException。我应该如何处理这个问题?我可以在setContext函数中放置一个try-catch,并将该值设置为null,以防出现错误。如果我注意到上下文变量为null,我会从我的函数中抛出一个错误 public class HTTPRequest
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
- 如果异常应该停止处理,并且在抛出
时不应该执行特定的处理,那么按照Kayaman的建议抛出一个泛型nosuchagorithmexception
运行时异常就足够了:
试试看{ 返回SSLContext.getInstance(“TLSv1.2”); }捕获(无算法异常){ 抛出新的运行时异常(e); }
- 如果由于异常不应阻止应用程序继续工作而应忽略异常,则只需捕获它并使用您认为正确的日志级别进行日志记录
试试看{ 返回SSLContext.getInstance(“TLSv1.2”)