目次

ユーザ定義Javaクラスにnullを喰わす場合

2024-10-27
入力データにnull値が来る場合の対処のメモ

定義

Jarファイル

ユーザ定義Javaクラスから呼び出す外部処理を格納したJarファイル内のクラスのコード。

MakeTowTimes.java
package towTimesMethods;
import java.math.BigDecimal;
 
public class MakeTowTimes {
 
	private static BigDecimal ConstTow = new BigDecimal("2.0");
 
	public static long Makelong(long num) {
		return num * 2;
	}
 
	public static double Makedouble(double num) {
		return num * 2;
	}
 
	public static Long MakeLong(Long num) {
		if (num == null) return 0L;
		return num * 2;
	}
 
	public static Double MakeDouble(Double num) {
		if (num == null) return 0D;
		return num * 2;
	}
 
	public static BigDecimal MakeBigDecimal(BigDecimal num) {
		if (num == null) return BigDecimal.ZERO;
		return num.multiply(ConstTow);
	}
 
	public static String MakeString(String str) {
		if (str == null) return "";
		return str + str;
	}
}

とりあえずテスト。各メソッドの動作確認できました。

pentahoのデータ変換定義

Spoonの該当パスに先のコードで生成したJarファイルをコピーしてからSpoonを起動してユーザ定義Javaクラスを定義します。

ステップ「データグリッド」

2レコード定義してます。

ステップ「ユーザ定義Javaクラス」

入力項目の内容をJarファイル内のクラスのメソッドで処理するコードを定義します。

実行結果

Jarファイル内のクラスのメソッドを呼び出せました。

入力にnullが含まれる場合

レコードを1つ追加します。

全項目がnullの1レコードが追加されました。

実行結果

はい、見事異常終了となりました。

原因箇所

long型、double型の処理を除去すると動作します。

以下の2点、項目がnullの時異常終了する模様です。どうもメソッドgetLong(), getDouble()の戻り値がnullになる模様です。
なので Long から long へのキャスト、Double から double へのキャストでエラーになる訳です。※nullで返るとは思わなんだ…

  long      a11 = get(Fields.In, "long値").getLong(r);
  double    a12 = get(Fields.In, "double値").getDouble(r);