indexOf(),arrayList问题java

时间:2017-04-15 19:33:23

标签: java arraylist indexof

再次大家好,

我目前正在开发一个Java程序,它可以下载文件,读取它并将数据复制到不同的arrayList中。然后我只想用" indexOf()"来获取一些数据的索引。

我的主要没有问题:

import java.util.GregorianCalendar;
import yhhFin.StockDownloader;
import java.util.GregorianCalendar;
import java.util.ArrayList;
import java.util.Calendar;
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.io.*;
public class YhhFin {

   public static void main(String[] args) {


        Scanner sc = new Scanner(System.in); //declaration du Scanner
        String track = "AAPL"; 

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        LocalDate localDate = LocalDate.now();
        int moisAJD = localDate.getMonthValue();
        int anneeAJD = localDate.getYear();
        int jourAJD =localDate.getDayOfMonth();
        GregorianCalendar end = new GregorianCalendar ( anneeAJD, moisAJD, jourAJD);
        GregorianCalendar start = new GregorianCalendar(2011, 11, 11);
        StockDownloader test  = new StockDownloader(track, start, end);

    System.out.println("Quel prix?");
      double prix = sc.nextDouble();
      StockDownloader tro = new  StockDownloader(prix) ;
      }
  }

然后我的另一个类包含方法StockDownloader(prix)=>问题

package yhhFin;

public class StockDownloader
{


public static final int DATE = 0;
public static final int OPEN = 1;
public static final int HIGH = 2;
public static final int LOW = 3;
public static final int CLOSE = 4;
public static final int VOLUME = 5;
public static final int ADJCLOSE = 6;

private ArrayList<GregorianCalendar> dates;
private ArrayList<Double> open;
private ArrayList<Double> high;
private ArrayList<Double> low;
private ArrayList<Double> close;
private ArrayList<Integer> volume;
private ArrayList<Double> adjclose;


public StockDownloader (String symbol, GregorianCalendar start, GregorianCalendar end)
{
    dates= new ArrayList<GregorianCalendar>();
    open= new ArrayList<Double>();
    high= new ArrayList<Double>();
    low= new ArrayList<Double>();
    close= new ArrayList<Double>();
    volume= new ArrayList<Integer>();
    adjclose= new ArrayList<Double>();

   // http://chart.finance.yahoo.com/table.csv?s=IBM&a=0&b=2&c=1962&d=3&e=12&f=2017&g=d&ignore=.csv

   String url = "http://chart.finance.yahoo.com/table.csv?s="+symbol+"&a="+start.get(Calendar.MONTH)+
           "&b="+ start.get(Calendar.DAY_OF_MONTH)+
           "&c="+start.get(Calendar.YEAR)+
           "&d="+end.get(Calendar.MONTH)+
           "&e="+end.get(Calendar.DAY_OF_MONTH)+
           "&f="+end.get(Calendar.YEAR)+
           "&g=d&ignore=.csv";



   try
   {
       URL yhoofin = new URL (url);
       URLConnection data = yhoofin.openConnection();
       Scanner input = new Scanner(data.getInputStream());
       if(input.hasNext())  //skip header
           input.nextLine();

       while(input.hasNextLine())
       {   
            String line = input.nextLine();

            String st[]=line.split(",");



           for(int i = 0; i < st.length; i++)
           {
               DateFormat df = new SimpleDateFormat("yyyy-mm-dd");
               Date date = df.parse(st[0]);
               Calendar cal = Calendar.getInstance();
               cal.setTime(date);
               dates.add((GregorianCalendar) cal);

                double valOpen = Double.parseDouble(st[1]);
                open.add(valOpen);
                //System.out.println(open.get(i));
                double valHigh = Double.parseDouble(st[2]);
                high.add(valHigh);

                double valLow = Double.parseDouble(st[3]);
                low.add(valLow);

                double valClose = Double.parseDouble(st[4]);
                close.add(valClose);

                int valvolume = Integer.parseInt(st[5]);
                volume.add(valvolume);

                double adjClose = Double.parseDouble(st[6]);
                adjclose.add(adjClose);
            }

         }
   }
   catch (Exception e)
   {
       System.err.println(e);
   }
}

//the important method
public   StockDownloader (double price) {
   int index;
    index= open.indexOf(price);//the code crash when reaching this line
    System.out.println("INDEX : " +index);
}
}

我试图尽可能明确,这不是范围问题,因为数组在类中声明,所以我可以访问它们。

我能帮助你,因为我在这个问题上挣扎了好几天了。

非常感谢你。

Vik55

PS:我做了一些研究,我看到许多类似于这个的帖子,但无法解决我的问题,显然我可能有一个声明问题,我不是真的得到它。

2 个答案:

答案 0 :(得分:1)

你有两个构造函数。一个初始化arraylists,另一个没有。当然,所有的arraylists在构造函数中都是NULL,并没有初始化它们,所以当它尝试访问其中一个时,它会因为空指针异常而失败。

这是一个非常基本的错误,所有体面的编译器都会发出警告。所以:

  1. 了解如何在开发环境中启用警告。

  2. 启用所有警告。

  3. 关注他们。

答案 1 :(得分:0)

    index= open.indexOf(price);//the code crash when reaching this line
它崩溃了,因为开放点为null,也就是说它没有被初始化。 你应该添加

    open= new ArrayList<Double>();

就像你为其他构造函数所做的那样。