如何处理java中方法体外的异常表单?

时间:2016-01-24 13:11:17

标签: java exception-handling

请考虑以下代码:

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。

3 个答案:

答案 0 :(得分:2)

Provate方法

您可以使用静态私有方法创建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();
        }
    }
}