A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李建雄 黑马帝   /  2011-10-29 14:26  /  6439 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么while外,的ds.colse()会报错,,,
只要在DatagramSocket ds=new DatagramSocket(10000);语句后加
while(true){}后面的语句就出错,为什么?


public static void udpReceive() throws Exception{
               
                DatagramSocket ds=new DatagramSocket(10000);
               
                while(true){
                        byte[] buf=new byte[1024];
                        DatagramPacket dp=new DatagramPacket(buf,buf.length);
                       
                        ds.receive(dp);
                       
                        String ip=dp.getAddress().getHostAddress();
                        String data=new String(dp.getData(),0,dp.getLength());
                        int port=dp.getPort();
                       
                        System.out.println(ip+"::"+data+"::"+port);
                }
                //System.out.println("dd");
                //ds.close();

        }

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

8 个回复

倒序浏览
这是我改完的代码,可以运行了

public static void udpReceive(){
        
        DatagramSocket ds = null;
                try {
                        ds = new DatagramSocket(10000);
                         while(true){
                byte[] buf=new byte[1024];
                DatagramPacket dp=new DatagramPacket(buf,buf.length);
               
                ds.receive(dp);
               
                String ip=dp.getAddress().getHostAddress();
                String data=new String(dp.getData(),0,dp.getLength());
                int port=dp.getPort();
               
                System.out.println(ip+"::"+data+"::"+port);
        }
                } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        finally{
               
          //System.out.println("dd");
          ds.close();
        
        }

我个人认为是因为放在while(ture)后面的代码没有机会执行,所以就提示你去掉,不知道对不对

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
因为while总是为true,总是在执行不可能执行到while语句块后面的语句,
你可以改变while终止的条件,就可执行while后面的语句。例
int i=0;
        while(i==5){
                        ++i;

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
你说的应该有点道理,while(true)是无限循环,只要不跳出就不执行下面的代码,你如果在循环体里面加个循环结束的条件就不会报错了,例如加上break,就不抱错了

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黄健 黑马帝 2011-10-29 15:40:21
报纸
java在编译时会检查你的代码,发现代码//System.out.println("dd");//ds.close();前面是死循环,就提示这断代码“不可到达”,属于编译时错误,如果你非要死循环后再写代码,可以用下面代码欺骗一下java编译器:
public static void udpReceive() throws Exception{
   
    DatagramSocket ds=new DatagramSocket(10000);
    boolean flag = true;
    while(flag){//这里java编译器认为flag有可能为false,所以编译通过
            byte[] buf=new byte[1024];
            DatagramPacket dp=new DatagramPacket(buf,buf.length);
            
            ds.receive(dp);
            
            String ip=dp.getAddress().getHostAddress();
            String data=new String(dp.getData(),0,dp.getLength());
            int port=dp.getPort();
            
            System.out.println(ip+"::"+data+"::"+port);
    }
    System.out.println("dd");
    ds.close();
}

评分

参与人数 1技术分 +3 收起 理由
admin + 3

查看全部评分

回复 使用道具 举报
白倩 黑马帝 2011-10-29 16:05:54
地板
想让它执行while(true){}后面的语句,只要把这段代码加一个
try{

}catch(Exception e){

}finally{
  System.out.println("dd");
    ds.close();

}
就行了,把最后想要执行的语句放到finally块里。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
李建雄 黑马帝 2011-10-30 13:40:18
7#
黄健 发表于 2011-10-29 15:40
java在编译时会检查你的代码,发现代码//System.out.println("dd");//ds.close();前面是死循环,就提示这断 ...

不错的方法.谢谢!
回复 使用道具 举报
李建雄 黑马帝 2011-10-30 13:41:49
8#
白倩 发表于 2011-10-29 16:05
想让它执行while(true){}后面的语句,只要把这段代码加一个
try{

实际开发中确实要加,try 语句 ,谢谢!!
回复 使用道具 举报
李建雄 黑马帝 2011-10-30 13:42:52
9#
olkldksl 发表于 2011-10-29 14:52
这是我改完的代码,可以运行了

public static void udpReceive(){

谢谢你的解释.很不错!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马