JAVA Collections.sort方法在SSH三大框架中使用中的問題
最近,一同學在開發中遇到了SSH三大框架中使用到了Collections.sort方法。然而,他開發環境中的JDK
是1.7.0_64,網站部署的JDK版本是1.7.0_80,他透過開發環境中產生的.class直接去更新網站部署環境中的.class
檔案後,程式相關功能模組執行到Collections.sort不繼續執行也不報錯,而前臺ajax因此取不到資料。
類似的遠端如下:
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檔案類,程式執行到:
System.out.println(">>>>>>>>>>bvlist for2 ipflist:"+bvlist.size());
而下邊的方法不執行也不報錯:
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上均可以執行,測試程式如下:
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上釋出網站,發現如下程式順利執行:
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; } });
到此問題得到了解決!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29357786/viewspace-2218298/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java中Collections.sort排序詳解Java排序
- Java反射全解析(使用、原理、問題、在Android中的應用)Java反射Android
- pageHelper在Spring框架中pageSize無法修改的問題Spring框架
- java中亂碼問題解決方法Java
- java——ArrayList中contains()方法中的疑問JavaAI
- 這幾道Java集合框架面試題在面試中幾乎必問Java框架面試題
- Java中的"+"運算問題Java
- 在非同步方法中獲取登陸使用者時出現的問題非同步
- 在Linux中如何登出其他 SSH 使用者Linux
- java中json的使用方法JavaJSON
- java學習中不懂的問題Java
- java中list的常見問題。Java
- laravel使用中遇到的問題Laravel
- Java工作中的併發問題處理方法總結Java
- goland中npm無法使用的問題及解決方法GoLandNPM
- JQuery中ajax的使用與快取問題的解決方法jQuery快取
- 在Java中this關鍵字的使用Java
- Java中try()catch{}的使用方法Java
- 詳解SSH 框架中物件呼叫流程框架物件
- 在 Java 中如何使用 transientJava
- vue中methods中的方法閉包快取問題Vue快取
- weex使用中的問題記錄
- Typora 使用中的幾個問題
- thrift使用過程中的問題
- 在Linux中,什麼是SSH,並且如何使用它?Linux
- 正規表示式在Java中的使用Java
- Collections.sort()方法,字元排序字元排序
- java中的方法Java
- Java script 中的函式使用方法Java函式
- Redis的安裝及在Java中的使用RedisJava
- JS縮排的問題(還在更新中...)JS
- Java中的四層框架Java框架
- Java集合中的框架2Java框架
- 模板方法中的執行緒安全問題執行緒
- 學習Java中遇到的繼承問題Java繼承
- Java在演算法題中的輸入問題Java演算法
- Linux while 迴圈中使用ssh問題LinuxWhile
- Vue使用中遇到的程式碼問題Vue