记录各种老师上课讲了但是不以为然结果掉坑里了错(一)

全局变量是有害的!

全局变量是有害的!

全局变量是有害的!

package com.bigwork.bl.managementServiceImpl;

import com.bigwork.bl.listServiceImpl.SingleStock_Impl;
import com.bigwork.bl_service.KDJ_service;
import com.bigwork.bl_service.SingleStock_service;
import com.bigwork.model.KDJValue;
import com.bigwork.model.Stock;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * Created by ryysuke on 16/5/13.
 */
public class KDJ_Impl implements KDJ_service {

    ArrayList<Double> k = new ArrayList<>();
    ArrayList<Double> d = new ArrayList<>();
    ArrayList<Double> j = new ArrayList<>();
    ArrayList<Double> rsv = new ArrayList<>();

    String id;
    String from;
    String to;
    int day;

    SingleStock_service single = new SingleStock_Impl();
    CalcuDate cal = new CalcuDate();

    private ArrayList<KDJValue> getKDJs(){
        int num = day/7;
        num = num*2+2 + day;
        String realStart = cal.calDate(from, -num);
        ArrayList<Stock> list = single.setTimeFromDB(id, realStart, to);
        ArrayList<KDJValue> result = new ArrayList<>();
        int size = list.size();
        for(int i = day - 1; i < size; i++){
            double l = getLow(list.subList(i - day + 1, i + 1));
            double h = getHigh(list.subList(i - day + 1, i + 1));
            double c = list.get(i).getClose();
            rsv.add((c - l) / (h - l) * 100);
        }
        initArrayData(list);
        int n = rsv.size();
        for(int i = 0; i < n; i++){
            System.out.println("list.size=" + size + "      real pr = " + (i+day-2));
            String date = list.get(i+day-1).getDate();
            BigDecimal tmp = new BigDecimal(k.get(i));
            double kValue = tmp.setScale(2, BigDecimal.ROUND_HALF_DOWN).doubleValue();
            tmp = new BigDecimal(d.get(i));
            double dValue = tmp.setScale(2, BigDecimal.ROUND_HALF_DOWN).doubleValue();
            tmp = new BigDecimal(j.get(i));
            double jValue = tmp.setScale(2, BigDecimal.ROUND_HALF_DOWN).doubleValue();
            KDJValue kdjValue = new KDJValue(date, kValue, dValue, jValue);
            result.add(kdjValue);
        }
        return result;
    }

    private void initArrayData(ArrayList<Stock> list){
        k.add(2.0/3 * 50 + 1.0/3*rsv.get(0));
        d.add(2.0/3*50+1.0/3*k.get(0));
        j.add(3*k.get(0) - 2*d.get(0));

        int num = rsv.size();
        for(int i = 1; i  < num; i ++){
            k.add(2.0/3*k.get(i-1) + 1.0/3*rsv.get(i));
            d.add(2.0/3*d.get(i-1) + 1.0/3*k.get(i));
            j.add(3*k.get(i) - 2*d.get(i));
        }


    }

    private double getHigh(List<Stock> list){
        double max = list.get(0).getHigh();
        int num = list.size();
        for(Stock stock : list){
            if(max < stock.getHigh()){
                max = stock.getHigh();
            }
        }
        return max;
    }

    private double getLow(List<Stock> list){
        double min = list.get(0).getLow();
        int num = list.size();
        for(Stock stock : list){
            if(min > stock.getLow()){
                min = stock.getLow();
            }
        }
        return min;
    }





    @Override
    public ArrayList<KDJValue> getKDJGraph(String ID, String from, String to, int day) {
        this.id = ID;
        this.from = from;
        this.to = to;
        this.day = day;

        ArrayList<KDJValue> result = getKDJs();
        rsv=null;
        return result;
    }

    public static void main(String[] args){
        KDJ_service test = new KDJ_Impl();
        ArrayList<KDJValue> re = test.getKDJGraph("sz002644", "2015-01-15", "2015-12-29", 9);
        for (KDJValue k : re){
            System.out.println("Date: " + k.getDate() + " k: " + k.getK() + " d: " + k.getD()
            + " j: "+ k.getJ());
        }
}
}
像这种代码,跑一次是没错的,但是跑第二次第三次就会报错,因为每次返回的时候arraylist没有设为null,这些对象都没有死掉,再跑第二遍就会报错,数组越界。比如main写成这样↓↓↓

public static void main(String[] args){
        KDJ_service test = new KDJ_Impl();
        for(int i = 0;i<5;i++) {
            ArrayList<KDJValue> re = test.getKDJGraph("sz002644", "2015-01-15", "2015-12-29", 9);
            for (KDJValue k : re) {
                System.out.println("Date: " + k.getDate() + " k: " + k.getK() + " d: " + k.getD()
                        + " j: " + k.getJ());
            }
            System.out.println("------------------------------------我是分割线---------------------------");
        }
}
所以每次都要把这些数组清空

rsv.clear();
k.clear();
d.clear();
j.clear();

亲测=null也是不行的,会报空指针的错,这也很好的证明了两次执行用的是同一个对象。

P.S以前写程序都是只要得到正确的计算结果就好啦所以对老师之前说的很多都不以为然,web就让我从不一样的视角看这个程序,同一个程序,跑一遍可以,刷新一遍就500了???内心ORZ....

不过还是觉得ajax和js是个很神奇的东西,异步什么的还得好好体会体会啦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值