当前位置:首页 > 系统运维

JAVA Collections.sort方法在SSH三大框架中使用中的问题

      最近,方法一同学在开发中遇到了SSH三大框架中使用到了Collections.sort方法。大框然而,架中他开发环境中的使用JDK

是1.7.0_64,网站部署的问题JDK版本是1.7.0_80,他通过开发环境中产生的方法.class直接去更新网站部署环境中的.class

JAVA Collections.sort方法在SSH三大框架中使用中的问题

文件后,程序相关功能模块执行到Collections.sort不继续执行也不报错,大框而前台ajax因此取不到数据。架中

JAVA Collections.sort方法在SSH三大框架中使用中的问题

类似的使用远程如下:

JAVA Collections.sort方法在SSH三大框架中使用中的问题

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 public String analysisBillByIllName(){ if(!"".equals(queryItem)){           List<IllnessPrescriptionFrequency> ipflist = ipfs.findByIllName(queryItem); List<BillView> bvlist = new ArrayList<BillView>(); if(ipflist.size()!=0){               int sumfreq = 0; for(IllnessPrescriptionFrequency inst:ipflist){ if(!"".equals(inst.getId().getBillIds())){                       String[] bids = inst.getId().getBillIds().split("\\$"); for(int i=0;i<bids.length;i++){ BillView bv = new BillView(); bv.setBillId(Integer.parseInt(bids[i])); bv.setFrequency(inst.getId().getPrescriptionFreequency()); sumfreq +=inst.getId().getPrescriptionFreequency(); bvlist.add(bv); } } } for(int j=0;j<bvlist.size();j++){ for(int k=j+1;k<bvlist.size() -1;k++){ if(bvlist.get(j).getBillId().equals(bvlist.get(k).getBillId())){ bvlist.get(j).setFrequency(bvlist.get(j).getFrequency()+bvlist.get(k).getFrequency()); bvlist.remove(k); } } } System.out.println(">>>>>>>>>>bvlist for2 ipflist:"+bvlist.size()); final int sumRatio = sumfreq;  Collections.sort(bvlist,new Comparator<BillView>(){ //list sort public int compare(BillView bv1,BillView bv2){ if(bv1.getFrequency()<bv2.getFrequency()){ return 1; } if(bv1.getFrequency()==bv2.getFrequency()){ return 0; } return -1; } }); System.out.println(">>>>>>>>>>bvlist Collections:"+bvlist.size()); for(BillView bv:bvlist){ Bill qb = bills.findById(bv.getBillId()); bv.setBillName(qb.getBillName()); float divd = bv.getFrequency()/sumRatio; bv.setUseageRatio(divd); bv.setIllName(queryItem); } flag="data"; jsonArray = JSONArray.fromObject(bvlist); System.out.println(jsonArray.toString()); return SUCCESS; }else{ flag="none"; return SUCCESS; } }else{ return ERROR; } }

如上程序通过AJAX异步访问,在开发环境中能正常执行;但是问题使用低版本的JDK编译后的.class文件直接去替换高版本下

的同名.class文件类,站群服务器程序执行到:

1 System.out.println(">>>>>>>>>>bvlist for2 ipflist:"+bvlist.size());

而下边的方法方法不执行也不报错:

1 2 3 4 5 6 7 8 9 10 11 Collections.sort(bvlist,new Comparator<BillView>(){ //list sort public int compare(BillView bv1,BillView bv2){ if(bv1.getFrequency()<bv2.getFrequency()){ return 1; } if(bv1.getFrequency()==bv2.getFrequency()){ return 0; } return -1; } });

程序无法执行Collections.sort,不能执行到函数返回语句,大框AJAX异步访问获取不到数据,架中导致前台报错获取数据失败。使用

    在问题排查过程中,问题经历了如下过程:

    1、开发环境是windows,网站部署环境是centos6.8,前后重新编译了网站代码,并且重新部署了centos上的网站,

问题还是不执行Collections.sort;

    2、怀疑是阿里云环境安全的限制,关闭了主机防火墙,云服务器但是Collections.sort方法还是不执行也不报错;

    3、单独编辑测试Collections.sort的java类分别在windows和centos环境下编译执行,发现Collections.sort在windows和centos上均可以执行,测试程序如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; class BillView{ private Integer billId; private String billName; private String illName; private int frequency; private float useageRatio; public Integer getBillId() { return billId; } public void setBillId(Integer billId) { this.billId = billId; } public String getBillName() { return billName; } public void setBillName(String billName) { this.billName = billName; } public String getIllName() { return illName; } public void setIllName(String illName) { this.illName = illName; } public int getFrequency() { return frequency; } public void setFrequency(int frequency) { this.frequency = frequency; } public float getUseageRatio() { return useageRatio; } public void setUseageRatio(float useageRatio) { this.useageRatio = useageRatio; } public BillView() { } public BillView(Integer billId, String billName, String illName, int frequency, float useageRatio) { super(); this.billId = billId; this.billName = billName; this.illName = illName; this.frequency = frequency; this.useageRatio = useageRatio; } } public class Test { public static void main(String[] args){ List<BillView> bvlist = new ArrayList<BillView>(); BillView bv1 = new BillView(1, "苹果", null, 1, 0);  BillView bv2 = new BillView(2, "香蕉", null, 4, 0); BillView bv3 = new BillView(3, "橘子", null, 2, 0); BillView bv4 = new BillView(4, "梨", null, 9, 0); bvlist.add(bv1); bvlist.add(bv2); bvlist.add(bv3); bvlist.add(bv4); Collections.sort(bvlist,new Comparator<BillView>(){ //list sort public int compare(BillView bv1,BillView bv2){ if(bv1.getFrequency()<bv2.getFrequency()){ return 1; } if(bv1.getFrequency()==bv2.getFrequency()){ return 0; } return -1; } }); System.out.println("collections --->"+bvlist.size()); for(BillView bv:bvlist){ System.out.println("  "+bv.getBillName()+"  "+bv.getFrequency()); } } }

  4、查看windows和centos环境下的JDK版本,发现两边环境JDK版本不一致,windows环境下jdk版本是:1.7.0_64,而

centos环境下JDK版本是1.7.0_80;将windows环境下JDK版本更新到1.7.0_80,并指定开发工具myeclipse的Java编译使用

JDK1.7.0_80版本,重新编译网站源码,在centos上发布网站,发现如下程序顺利执行:

1 2 3 4 5 6 7 8 9 10 11 Collections.sort(bvlist,new Comparator<BillView>(){ //list sort public int compare(BillView bv1,BillView bv2){ if(bv1.getFrequency()<bv2.getFrequency()){ return 1; } if(bv1.getFrequency()==bv2.getFrequency()){ return 0; } return -1; } });

  到此问题得到了解决!

源码下载

分享到:

滇ICP备2023006006号-16