为什么我无法捕获java.net.SocketTimeoutException?

时间:2012-05-11 18:45:29

标签: java sockets socketexception socket-timeout-exception

我有一个Simple Multithread Server,Threads的代码如下:

public void run(){

 while(Ecoute()){

     str=LireTrame(this.socClient);//read text byte by byte 

    //some code here

    Dormir(500);//Sleep for 500ms  
   }     


}

我想创建3分钟的超时,如果客户端套接字在3分钟内没有发送消息,则必须关闭该线程......

所以我试试看:

 public void run(){

        try {
        socClient.setSoTimeout(180000);//timeout for 3 min...
    } catch (SocketException ex) {
        Logger.getLogger(tache.class.getName()).log(Level.SEVERE, null, ex);
    }


 while(Ecoute()){

     try{
      str=LireTrame(this.socClient);//read text byte by byte 
    }
    catch(java.net.SocketTimeoutException ex){
     log.append("timeout exception has benn catched \n") ;
     break;//break the while
   } 

    //some code here

    Dormir(500);//Sleep for 500ms  
   }     


}

问题是netbeans显示错误消息: enter image description here

java.net.SocketTimeoutException never thrown in body of corresponding try statement

我用SocketException尝试了这个但结果相同..

为什么我不能抓住它们?

UPDATE :根据thinksteep和mprabhat的回复,我在LireTrame(..)中添加了抛出但仍然无法捕捉到异常:

 public  String LireTrame(Socket socClient) throws java.net.SocketTimeoutException{
 int c = 0;
  String Nmea="";
boolean finL=true;
 do{
            try {
                c=socClient.getInputStream().read();
            } catch (IOException ex) {
                Logger.getLogger(tache.class.getName()).log(Level.SEVERE, null, ex);
            }
    char ch=(char)c;

    Nmea=Nmea+ch;
    if(ch==';')
        finL=false;

  }while(finL);
 return Nmea;
 }



mai 11, 2012 8:04:02 PM Daemon.tache LireTrame
Grave: null
java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(SocketInputStream.java:150)
    at java.net.SocketInputStream.read(SocketInputStream.java:121)
    at java.net.SocketInputStream.read(SocketInputStream.java:203)
    at Daemon.tache.LireTrame(tache.java:232)
    at Daemon.tache.run(tache.java:87)
    at java.lang.Thread.run(Thread.java:722)

有什么想法可以做到这一点吗?

4 个答案:

答案 0 :(得分:1)

=LireTrame(this.socClient);//read text byte by byte

应抛出SocketTimeOutException。你没有发布这个方法的代码,但我假设它没有抛出SocketTimeOutException,这就是netbeans突出显示的原因。

答案 1 :(得分:0)

SocketTimeoutException是一个checked exception所以在你抓住它之前你应该抛出异常。

所以

=LireTrame(this.socClient);//read text byte by byte

应先抛出SocketTimeoutException才能抓住它。

您只是记录异常而不是重新抛出异常

此行之后

Logger.getLogger(tache.class.getName()).log(Level.SEVERE, null, ex);

也添加此行

 throw SocketTimeoutException('SocketTimeOutException');

答案 2 :(得分:0)

我会声明LireTrame()抛出IOException并完全删除内部的try / catch。这是结构不佳的代码。

答案 3 :(得分:-1)

这无疑是在黑暗中拍摄的。我不使用netbeans,我确实使用eclipse。在eclipse中,有时JDT编译器与现实不同步。做一个干净的项目构建可以解决问题。

我认为在你的情况下,正在行动的是netbeans。如果你执行javac的命令行调用,你会得到那个错误。如果没有,做一个干净的内部netbeans很可能解决问题。