0

我有下一个代码,基于使用 Java UDPSocket() 的示例(不是内置类):

package BomberButti;
import java.io.*; 
import java.net.*; 

/**
 * BomberServer
 * Hier wordt de Server opgezet waarop Clients kunnen connecteren om vervolgens tegen elkaar te spelen
 * @author Kaj
 */
public class BomberServer {

    public BomberServer() {
        waitForPlayers();
    }

    public static void waitForPlayers() throws Exception {
        try {
            DatagramSocket serverSocket = new DatagramSocket(9876); //Socket openen

            byte[] receiveData = new byte[1024]; //Ontvangen gegevens
            byte[] sendData  = new byte[1024];  //Te verzenden gegevens

            while(true) {
                receiveData = new byte[1024]; 

                //Ontvangen data (als die er is) ophalen
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 

                System.out.println ("Waiting for datagram packet");

                serverSocket.receive(receivePacket); 

                String sentence = new String(receivePacket.getData()); 

                InetAddress IPAddress = receivePacket.getAddress(); 

                int port = receivePacket.getPort(); 

                System.out.println ("From: " + IPAddress + ":" + port);
                System.out.println ("Message: " + sentence);

                String capitalizedSentence = sentence.toUpperCase(); 

                sendData = capitalizedSentence.getBytes(); 
                sendData = new String("Request accepted").getBytes();
                DatagramPacket sendPacket = 
                   new DatagramPacket(sendData, sendData.length, IPAddress, 
                                     port); 

                serverSocket.send(sendPacket); 

              } 
        }
        catch(SocketException ex) {
            System.out.println("UDP Port 9876 is occupied.");
            System.exit(1);
        }
    }
    public static void main(String args[])  {
        BomberServer server = new BomberServer();
    }
}

尝试运行此代码时,我收到错误“未报告的异常异常;必须被抓住或宣布被抛出”。

我知道这与我放置在我的 waitForPlayers() 方法声明后面的“抛出异常”有关。但是当我删除这个 throws Exception 部分时,我在该行收到一个错误: serverSocket.receive(receivePacket); 'unreporter 异常 IOException; 必须宣布被抛出'所以我想我尝试的两种方法都不是正确的方法。

那么我该怎么做才能正确呢?

真挚地,

卢克索

4

3 回答 3

3

里面的代码waitForPlayers()可以抛出 IOException,所以方法应该声明它抛出 IOException(而不是 Exception,因为 Exception 太模糊了):

public static void waitForPlayers() throws IOException {

由于此方法可以抛出 IOException,并且您从构造函数调用此方法而不会捕获 IOException,因此构造函数还必须声明它会抛出 IOException:

public BomberServer() throws IOException {

当然,调用这个构造函数的方法也必须要么捕获 IOException,要么声明它抛出 IOException 等等,直到你可以处理这个 IOException,从而捕获它来处理它。

阅读有关异常的教程

重要提示:捕获异常,打印其堆栈跟踪,并像什么都没发生一样继续,这通常不是处理异常的方式。

于 2012-12-17T20:25:41.333 回答
1

添加throws ExceptionBomberServer()main()

public class BomberServer {

    public BomberServer() throws Exception {
        waitForPlayers();
    }

    public static void waitForPlayers() throws Exception {
        ...
    }
    public static void main(String args[]) throws Exception {
        BomberServer server = new BomberServer();
    }
}
于 2012-12-17T20:29:43.233 回答
0

错误消息可能会更清楚一些。中的声明waitForPlayers()大部分都很好,但是您需要在调用它的代码(以及调用它的代码......)中进行类似的声明,直到您一直到main( )或一个try...catch块。

说得更具体一些,IOException而不是仅仅说出来Exception可能会更安全一些。

于 2012-12-17T20:25:19.853 回答