请考虑以下代码:
public class A
{
static final List<Integer> list = new ArrayList<>();
}
上面的代码似乎工作正常。但是,当我使用以下内容时:
public class A
{
static final ServerSocket ss = new ServerSocket(6666);
}
在这里,我看到IOException类型的未处理异常。 我尝试了 try-catch 块和抛出关键字。 我无法通过使用上述两个来解决这个问题。它们可能有效,但无法弄清楚如何运作。有没有办法处理这个异常? 目前正在使用JDK 7。
答案 0 :(得分:2)
您可以使用静态私有方法创建ServerSocket
,在此方法中,您可以处理异常并执行您想要的操作。
public class A
static final ServerSocket ss = createServerSocket();
private static ServerSocket createServerSocket() {
try {
return new ServerSocket(6666);
} catch (IOException e) {
throw new RuntimeException();
}
}
}
另一种方法是使用静态块。然后你的代码看起来像这样。
public class A {
static final ServerSocket ss;
static {
try {
ss = new ServerSocket(6666);
} catch (IOException e) {
throw new RuntimeException();
}
}
}
答案 1 :(得分:1)
有多种方法可以做到这一点,但最好的方法是使用init方法,因此您可以处理异常并且您的代码可以重复使用。
所以只需在类中定义静态init方法
public class A{
static ServerSocket ss;
public static void init(int port) throws IOException{
ss = new ServerSocket(port);
}
}
此代码允许您通过将异常提供给更高的实例(调用者)来处理异常,并且它允许您在另一个程序中重用该代码(端口号不能修复)。
另一种方法是使用内部异常处理的静态块,使用它不是一个好主意,因为它很难保留它并且异常处理真的很难
static {
try {
ss = new ServerSocket(6666);
} catch (IOException e) {
e.printStackTrace();
}
}
另见:
http://docs.oracle.com/javase/8/docs/api/java/lang/ExceptionInInitializerError.html
答案 2 :(得分:0)
使用静态初始化块来捕获这样的异常:
public class A {
static final ServerSocket ss;
static {
try {
ss = new ServerSocket(6666);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}