我有下一个代码,基于一个使用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
答案 0 :(得分:3)
waitForPlayers()
内的代码可以抛出IOException,因此该方法应该声明它抛出IOException(而不是Exception,因为Exception太模糊了):
public static void waitForPlayers() throws IOException {
由于此方法可以抛出IOException,并且您从构造函数中调用此方法而不捕获IOException,因此构造函数还必须声明它抛出IOException:
public BomberServer() throws IOException {
当然,调用此构造函数的方法也必须捕获IOException,或者声明它抛出IOException等等,直到达到可以处理此IOException的程度,从而将其捕获到处理它。
重要提示:捕获异常,打印其堆栈跟踪,并继续进行,好像什么都不发生,通常不是应该如何处理异常。
答案 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
可能会更安全一些。