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

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

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

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

类似的远程如下:

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"苹果"null10); 

        BillView bv2 = new BillView(2"香蕉"null40);

        BillView bv3 = new BillView(3"橘子"null20);

        BillView bv4 = new BillView(4"梨"null90);

        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;

                    }

                });

  到此问题得到了解决!

猜你喜欢

转载自blog.csdn.net/www_xue_xi/article/details/83590524