0

我正在尝试下面的代码,但它不允许我在 main 方法之外初始化套接字对象。有人可以向我解释这个问题吗?

import java.net.DatagramSocket;

public class Server
{
    DatagramSocket socket = new DatagramSocket();
    public static void main(String[] args) {
    Server server = new Server();
    //server.socket = new DatagramSocket(); this is the suggested and working way

    }
} 

/*The error is : error: unreported exception SocketException; must be caught or declared to be thrown
    DatagramSocket socket = new DatagramSocket();*/

为什么我在 main 方法之外初始化其他对象时没有收到错误消息?是否应该在 main 方法中初始化所有对象?

更新: 让我感到困惑的是这个问题的答案:“通常,您不会在 METHODS 之外创建对象 - 主要或其他。所以你可以在 main 之外创建对象,但在一些 OTHER 方法中。”</p>

为什么这是个问题?

4

2 回答 2

1

问题是 DatagramSocket 构造函数抛出一个 SocketException ,因此必须捕获 Throwable。您不能将 Throwable 捕获为类成员。

于 2020-03-06T19:52:11.763 回答
1

正如另一个答案正确指出的那样,您需要处理异常。你可以这样做:

import java.net.DatagramSocket;

public class Server
{
    DatagramSocket socket = newDatagramSocket();

    private static DatagramSocket newDatagramSocket() {
        try {
            return new DatagramSocket();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
            return null;
        }
    }

    public static void main(String[] args) {
        Server server = new Server();
        //server.socket = new DatagramSocket(); this is the suggested and working way

    }
}

在这种情况下,它由堆栈跟踪 + 错误退出来处理,但可能是另一种选择null

于 2020-03-07T03:08:31.193 回答