Java类使用异常

时间:2012-12-17 20:19:33

标签: java exception

我有下一个代码,基于一个使用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 exception IOException;必须宣布被抛出'所以我猜我试过的两种方式都不是正确的方法。

那么我该如何做才是正确的呢?

此致,

LUXO

3 个答案:

答案 0 :(得分:3)

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

public static void waitForPlayers() throws IOException {

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

public BomberServer() throws IOException {

当然,调用此构造函数的方法也必须捕获IOException,或者声明它抛出IOException等等,直到达到可以处理此IOException的程度,从而将其捕获到处理它。

阅读tutorial about exceptions

重要提示:捕获异常,打印其堆栈跟踪,并继续进行,好像什么都不发生,通常不是应该如何处理异常。

答案 1 :(得分:1)

throws Exception添加到BomberServer()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();
    }
}

答案 2 :(得分:0)

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

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