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()メソッドの宣言の背後に配置した「throwsException」に関係していることを理解しています。しかし、これを削除すると、例外部分がスローされ、次の行でエラーが発生します。serverSocket.receive(receivePacket); 'unreporter例外IOException; スローされるように宣言する必要があるので、私が試した両方の方法のどちらも正しい方法ではないと思います。

それで、それが正しいことをどのように行う必要がありますか?

心から、

Luxo

4

3 に答える 3

3

内部のコードwaitForPlayers()はIOExceptionをスローする可能性があるため、メソッドはIOExceptionをスローすることを宣言する必要があります(例外があいまいすぎるため、例外ではありません)。

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 に答える