2013-11-24 1 views
0

Я пытаюсь отобразить StackedBarChart с Java FX (работает 1.7.0_45)Исключение нулевого указателя на StackedBarChart

я получаю следующее

java.lang.NullPointerException 
    at javafx.scene.chart.StackedBarChart.getDataItem(StackedBarChart.java:500) 
    at javafx.scene.chart.StackedBarChart.updateAxisRange(StackedBarChart.java:390) 
    at javafx.scene.chart.XYChart.layoutChartChildren(XYChart.java:620) 
    at javafx.scene.chart.Chart$1.layoutChildren(Chart.java:84) 
    at javafx.scene.Parent.layout(Parent.java:1018) 

Мой код ниже

public StackedBarChart<String, Number> createTreeNbChart() { 
     String[] typeString = new String[TypeE.values().length]; 
     for (int i = 0; i < typeString.length; i++) { 
      typeString[i] = TypeE.values()[i].toString(); 
     } 
     final CategoryAxis xAxis = CategoryAxisBuilder 
       .create() 
       .label("Type") 
       .categories(
         FXCollections.<String> observableArrayList(typeString)) 
       .build(); 
     final NumberAxis yAxis = NumberAxisBuilder.create().label("Nb").build(); 

     List<Tree> didBurn = new ArrayList<Tree>(); 
     List<Tree> didGive = new ArrayList<Tree>(); 
     List<Tree> nothingYet = new ArrayList<Tree>(); 
     this.organizeTreesInto(didBurn, didGive, nothingYet); 

     // Trees which did give 
     ArrayList<StackedBarChart.Data<String, Number>> giveDataList = new ArrayList<>(); 
     for (TypeE type : TypeE.values()) { 
      giveDataList.add(new StackedBarChart.Data<String, Number>(
        type.toString(), this.treesFromListWithType(didGive, type) 
          .size())); 
     } 
     StackedBarChart.Series<String, Number> didGiveSeries = new StackedBarChart.Series<String, Number>(
       "ont donné", 
       FXCollections.observableArrayList(giveDataList)); 

     // Trees which did burn 
     ArrayList<StackedBarChart.Data<String, Number>> didBurnDataList = new ArrayList<>(); 
     for (TypeE type : TypeE.values()) { 
      didBurnDataList.add(new StackedBarChart.Data<String, Number>(type 
        .toString(), this.treesFromListWithType(didBurn, type) 
        .size())); 
     } 
     StackedBarChart.Series<String, Number> didBurnSeries = new StackedBarChart.Series<String, Number>(
       "ont brûlé", FXCollections.observableArrayList(didBurnDataList)); 

     // Trees with nothing yet 
     ArrayList<StackedBarChart.Data<String, Number>> nothingYetDataList = new ArrayList<>(); 
     for (TypeE type : TypeE.values()) { 
      didBurnDataList.add(new StackedBarChart.Data<String, Number>(type 
        .toString(), this.treesFromListWithType(nothingYet, type) 
        .size())); 
     } 
     StackedBarChart.Series<String, Number> nothingYetSeries = new StackedBarChart.Series<String, Number>(
       "les autres", 
       FXCollections.observableArrayList(nothingYetDataList)); 

     ObservableList<StackedBarChart.Series<String, Number>> barChartData = FXCollections 
       .observableArrayList(didGiveSeries, didBurnSeries, 
         nothingYetSeries); 
     final StackedBarChart<String, Number> chart = new StackedBarChart<String, Number>(
       xAxis, yAxis, barChartData); 
     return chart; 

Все выглядит хорошо для меня. Единственное, что на данный момент, все мои списки данных пустые, поэтому серия будет пуста. Может быть, проблема связана с этим?

ответ

0

Я нашел проблему. Это было на самом деле копипаст ошибка в следующем коде

// Trees with nothing yet 
     ArrayList<StackedBarChart.Data<String, Number>> nothingYetDataList = new ArrayList<>(); 
     for (TypeE type : TypeE.values()) { 
      didBurnDataList.add(new StackedBarChart.Data<String, Number>(type 
        .toString(), this.treesFromListWithType(nothingYet, type) 
        .size())); 
     } 

Я добавлял материал в didBurnDataList вместо nothingYetDataList. Поэтому nothingYetDataList всегда был пустым. Я не уверен, что это хорошая причина бросить NPE в любом случае, так как можно подумать о сценарии, в котором серия гистограмм может быть пустым!