我正在尝试使用一个按钮来连接和接受传入连接。我喜欢像这样对按钮的动作监听器进行编码:
button1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
try
{
socket = serversocket.accept(); //accepts incoming connections
socket = new Socket(ip, port); //tries to connect if
} //servsock.accept() times out
catch (Exception e)
{
}
}
}
如果serversocket.accept()超时,则会导致异常,因此会跳过下一行。我必须把它们放在两个不同的试块中,还是有更好的方法呢?我不能在这里抛出异常,但是如果异常被抛出它会允许代码在出现异常时继续到下一行吗?
我不想编写自己的异常处理程序,我应该只使用两个try语句吗?
答案 0 :(得分:1)
你需要两个尝试阻止你尝试做的事情 - 然而,我不认为你应该做你正在做的事情。
如果抛出异常,粘贴的代码将不会执行第二行socket = new Socket
行。如果您想要执行第二行,那么您是正确的,您必须将其弹出到catch
块中,并在其中包含另一个try / catch以防止爆炸。
像这样:
try
{
socket = serversocket.accept(); //accepts incoming connections
} catch (Exception e)
{
try {
socket = new Socket(ip, port);
} catch (Exception e) {
//catch this and deal with it.
}
}
这里的问题是你不需要做你正在做的事情 - 我不是100%熟悉套接字(我只是阅读api {{3} }) - 但我认为你的代码应该是:
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
try {
//create a server socket to wait on some ip and port
ServerSocket serverSocket = new ServerSocket(ip, port);
//create a socket when a connection hits the ip and port
socket = serversocket.accept(); //accepts incoming connections
}
catch (IOException e){
//deal with io exception, depends on what you're doing.
}
catch (SecurityException e){
//deal with this, i don't know what it is.
//Probably you don't have a security manager(?),
// so you can leave this empty
}
catch (SocketTimeoutException e){
//no timeout, because we didn't set one in the ServerSocket constructor.
//leave this empty
}
catch (IllegalBlockingModeException e){
//wow sockets have exceptions, huh?
}
catch (Exception e) {
//you no longer need this catch block. Technically you shouldn't have
//one, but given the number of exceptions this thing throws that you aren't doing
//anything about because they're probably not relevant, you might want to just have
// this one... your call.
}
}
}
当然,也许你的按钮是点击时坐着等待套接字连接的东西,你在其他地方用超时定义了ServerSocket,你想要在超时失败的情况下发生事情。
如果 是这种情况,那么您将需要从catch块中调用重新启动套接字的相关函数。
像这样:
try
{
socket = serversocket.accept(); //accepts incoming connections
} catch (SocketTimeoutException e) {
//i left out the other exception handlers for clairty
//call a function here that does recreates the serversocket on the port
//in *that* function you will do exception handling for that call.
makeANewServerSocketFunctionBecauseTimedOut();
}
...
private void makeANewServerSocketFunctionBecauseTimedOut(){
try {
socket = new Socket(ip, port); //tries to connect
} catch (Exception e) { //consider putting all the specific exceptions here
// i don't know what you'd want to happen if this failed.
}
}
但在阅读完评论后 - 再次,我真的不熟悉套接字和套接字 - 您可能需要将所有这些包装在某种SwingWorker中,这是一种多线程工具,因为我认为实际上,您的整个应用程序将挂起,直到您获得连接...或超时发生。如同,没有其他按钮可以工作。
你可能根本不想要那个。
所以我写的一切都很疯狂!悲伤。
答案 1 :(得分:0)
只要将引发异常的代码放入try中,不就需要两个try
catch
。
此尝试中发生的任何事情都会被捕获。
try
{
socket = serversocket.accept(); //accepts incoming connections
socket = new Socket(ip, port); //tries to connect if
} //servsock.accept() times out
catch (Exception e)
{
// Do something here, because an exception happened above.
}
你的括号几乎都在说:内部任何东西抛出异常,抓住它。
答案 2 :(得分:0)
如果serversocket.accept()超时,则会导致异常,因此会跳过下一行。
跳过try
块的其余部分。
我必须将它们放在两个不同的试块中
无论如何,你需要将它们放入不同的块中。你永远不想一个接一个地执行这两行代码。如果接受失败,你只想尝试连接(为什么你这样做)。
我不能在这里抛出异常,但是如果抛出异常,它会允许代码在出现异常时继续到下一行吗?
在任何情况下,你都想要继续下一行。您希望处理已接受的套接字(如果有),并在接受失败时尝试连接。 Ergo,不同的街区。
我不想编写自己的异常处理程序
为什么不呢?
我应该使用两个try语句吗?
你有使用两个try语句。一到try/catch
SocketTimeoutException
accept(),
,如果你想在这种情况下尝试连接,你必须有一个新的try
,除非你已经为这个方法做好了准备将IOException
扔给来电者。