2012-12-17 25 views
0

我已经下一个代码,基于一个示例使用Java UDPSocket()(没有内置的类):使用Java类异常

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;必须被宣布为被抛出“,所以我猜想,我尝试的两种方式都不是正确的方式。

那么我该如何做到这一点是正确的?

真诚,

卢克索

+0

,你能否告诉我们堆栈跟踪? – Smit

+0

也捕获IOException – Suranga

回答

3

内部waitForPlayers()该代码可以抛出IOException,因此该方法应该声明其抛出IOException(而不是一个例外,因为异常太模糊):

public static void waitForPlayers() throws IOException { 

由于这种方法可以抛出IOException ,并调用从构造这个方法没有赶上IOException异常,构造函数也必须声明它抛出IOException异常:

public BomberServer() throws IOException { 

当然,它调用此构造方法也将不得不采取抓IOException,或声明它抛出IOException等等,直到你到达一个可以处理这个IOException的地步,从而抓住它来处理它。

阅读tutorial about exceptions

重要注意事项:捕获异常,打印其堆栈跟踪,并继续进行,如果没有发生任何事情,通常不是应该如何处理异常。

0

错误消息可能是一个更清晰一点。 waitForPlayers()中的声明基本没问题,但是您需要在调用它的代码(以及调用该代码的代码...)中发出类似的声明,直到完成main()try...catch块为止。

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

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(); 
    } 
}