- PR -

JFreeChartのIllegalArgumentException

1
投稿者投稿内容
MARU
会議室デビュー日: 2006/02/09
投稿数: 9
投稿日時: 2006-02-09 11:52
はじめまして。

JFreeChartを使ってLineChartを作っています。
固定データではチャートができましたが、DBからのデータではエラーが出てうまくできません。
エラーを見るとrowが問題みたいですが、理由がわかりません。。。
解決対策をぜひ教えてください。
よろしくお願いします。

・JFreeChartバージョン:1.0.1

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.*;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;

public class LineChartSample {

static {
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch(ClassNotFoundException e){
System.out.println(e);
}
}

public static void main(String[] args) {

String url = "jdbc:oracle:thin:@oracle:1521:db";
String user = "user";
String pwd = "password";
Statement stmt = null;
ResultSet rs = null;
int i=0;

double[][] data = new double[i][7];
double mon,tue,wed,thu,fri,sat,sun;
String itemName=new String();
Comparable[] row=new Comparable[]{};

//SQL
//レコードカウント用
String countSql="SELECT_COUNT_SQL";

//データ用
String sql="SELECT_SQL";

try {
Connection con=DriverManager.getConnection(url, user, pwd);
stmt= con.createStatement ();

rs = stmt.executeQuery (countSql);
rs.next();
int j = Integer.parseInt(rs.getString("COUNT"));

System.out.println(" j="+j);
rs.close();

rs = stmt.executeQuery (sql);

while (rs.next ()){

itemName=rs.getString("itemName");

mon=Double.parseDouble(rs.getString ("MON"));
tue=Double.parseDouble(rs.getString ("TUE"));
wed=Double.parseDouble(rs.getString ("WED"));
thu=Double.parseDouble(rs.getString ("THU"));
fri=Double.parseDouble(rs.getString ("FRI"));
sat=Double.parseDouble(rs.getString ("SAT"));
sun=Double.parseDouble(rs.getString ("SUN"));

row = new Comparable[j];
row[i]=itemName;

data =new double[j][7];
data[i][0]=mon;
data[i][1]=tue;
data[i][2]=wed;
data[i][3]=thu;
data[i][4]=fri;
data[i][5]=sat;
data[i][6]=sun;

i=i+1;
}
rs.close();
con.close();
System.out.println("row= "+row.length);
} catch (Exception e) {
e.printStackTrace();
}

Comparable[] col = new Comparable[] {"mon","tue","wed","thu","fri","sat","sun"};

CategoryDataset cData = DatasetUtilities.createCategoryDataset(row, col, data);    //→ここが131行目です

// オブジェクト生成
JFreeChart chart = ChartFactory.createLineChart("SampleLineGraph",
"Date", "Number", cData, PlotOrientation.VERTICAL, true,
true, false);

// チャート生成
File outputFile = new File("DBChart.png");

try {
ChartUtilities.saveChartAsPNG(outputFile, chart, 600, 600);
} catch (IOException ioEx) {
ioEx.printStackTrace();
}
}
}
===========ここからエラーです=================
j=14
row= 14
java.lang.IllegalArgumentException: Null 'key' argument.
at org.jfree.data.DefaultKeyedValues2D.getRowIndex(DefaultKeyedValues2D.java:168)
at org.jfree.data.DefaultKeyedValues2D.setValue(DefaultKeyedValues2D.java:274)
at org.jfree.data.DefaultKeyedValues2D.addValue(DefaultKeyedValues2D.java:260)
at org.jfree.data.category.DefaultCategoryDataset.addValue(DefaultCategoryDataset.java:191)
at org.jfree.data.general.DatasetUtilities.createCategoryDataset(DatasetUtilities.java:442)
at LineChartSample.main(LineChartSample.java:131)

[ メッセージ編集済み 編集者: MARU 編集日時 2006-02-09 11:52 ]
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-02-09 12:01
引用:

MARUさんの書き込み (2006-02-09 11:52) より:
はじめまして。

CategoryDataset cData = DatasetUtilities.createCategoryDataset(row, col, data);    //→ここが131行目です

j=14
row= 14
java.lang.IllegalArgumentException: Null 'key' argument.


問題があるとしたら
colかdataかもしれませんよ。少なくとも、rowはnullではないようですし。

131行目の直前に、以下のように入れてみては?
コード:
System.out.println("row : " + row);
System.out.println("data : " + data);
System.out.println("col : " + col);


少なくとも、どれかがnullなんでしょう。
どれがnullなのかが判明したら、次はその原因の確認です。
MARU
会議室デビュー日: 2006/02/09
投稿数: 9
投稿日時: 2006-02-09 13:13
引用:

Edossonさんの書き込み (2006-02-09 12:01) より:
問題があるとしたら
colかdataかもしれませんよ。少なくとも、rowはnullではないようですし。

131行目の直前に、以下のように入れてみては?
コード:
System.out.println("row : " + row);
System.out.println("data : " + data);
System.out.println("col : " + col);


少なくとも、どれかがnullなんでしょう。
どれがnullなのかが判明したら、次はその原因の確認です。


Edosson様、早速のアドバイスどうもありがとうございます。
おっしゃった通り、rowをプリントしてみたら
rowは全部(14件)nullでした。
配列の書き方が悪かったと思います。
申し訳ございませんが、

コード:
Comparable[] row=new Comparable[]{};
・・・中略・・・
itemName=rs.getString("itemName");
row = new Comparable[j];
row[i]=itemName;



の正しい書き方を教えてください。
よろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-02-09 13:17
「JFreeChartのIllegalArgumentException」は解決したようですから、焦点を明確にするためにも別スレッドにしてはいかがでしょう?
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-02-09 13:27
rowの要素がnullになっちゃう原因はここですね。
コード:
while (rs.next ()){

  itemName=rs.getString("itemName");

  ......

  row = new Comparable[j];
  row[i]=itemName; 

  ......



ループの中で要素ごとにrowを生成し直しているのが原因です。
要素が全部nullとのことですが、最後の要素(14番目でしょうか)だけは、
期待通りの値が入っているんでしょう。
どのように修正すべきか、についてはご自身で頑張ってください。
MARU
会議室デビュー日: 2006/02/09
投稿数: 9
投稿日時: 2006-02-09 14:01
Edosson様、ありがとうございます!
すごく助かりました〜^o^
1

スキルアップ/キャリアアップ(JOB@IT)