質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

13162閲覧

Apache POIでXSSFを使うとjava.lang.ExceptionInInitializerErrorになってしまう

kuxwax

総合スコア10

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/07/16 20:23

編集2015/07/17 12:28

javaでExcelを出力しようとしているのですがXSSFを使ってxlsxを出力しようとするとjava.lang.ExceptionInInitializerErrorがでてしまいます。
HSSFでxlsを出力した場合エラーは起きませんでした。
解決策を教えてほしいです。
お願いします。

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Excel {
public static void main(String[] args) {
Workbook wb = new XSSFWorkbook();
FileOutputStream out = null;
Sheet Main= wb.createSheet("main");
File F = new File("./sample.xlsx");
try{
out = new FileOutputStream(F);
wb.write(out);
out.close();
wb.close();
}catch(IOException e){
System.out.println(e.toString());
}

}

}

Exception in thread "main" java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.getMethod(SchemaTypeLoaderBase.java:73)
at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.<clinit>(SchemaTypeLoaderBase.java:66)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.xmlbeans.XmlBeans.getNoType(XmlBeans.java:856)
at org.apache.xmlbeans.XmlBeans.<clinit>(XmlBeans.java:881)
at org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook$Factory.newInstance(Unknown Source)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.onWorkbookCreate(XSSFWorkbook.java:407)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:219)
at Excel.main(Excel.java:14)
Caused by: java.lang.NullPointerException
at org.apache.xmlbeans.impl.store.Path.<clinit>(Path.java:70)
... 14 more

実行環境は
javaSE-1.7
Eclipse4.2 JUNO
POI-3.12
xmlbeans-2.6.0
です。

getCause().printStackTrace()を使用したところ

at org.apache.xmlbeans.impl.store.Path.<clinit>(Path.java:70)

がでました。これはなにを意味するのでしょう?

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argius

2015/07/17 00:41

コード自体には致命的な問題は無いようです。当方環境では動作しました。 JDKやPOIのバージョンの違いかも知れませんので、バージョンを教えていただけますでしょうか。
argius

2015/07/17 10:47

すみません、追加で教えてください。 POIのライブラリー依存関係はm2eclipseを使っていますか? もしそうなら、依存関係階層にxmlbeansがあるはずですが、そのxmlbeansのバージョンを教えてください。 そうでないなら、参照ライブラリーの構成を教えてください。
guest

回答4

0

ベストアンサー

この現象に見えますね。
このケースではendorsedディレクトリにjarを配置していますが、
kuxwaxさんの環境から見ると、POIというユーザライブラリが、
システムライブラリになっているのではないでしょうか?
理由がなければ、システムライブラリのチェックを外せば良いと思います。

いずれにしても、クラスパス周りの問題に見えますので、
それで解決しない場合は、
ユーザライブラリを使うのをやめて、
jarを直接クラスパスに追加すれば解決する可能性があります。

一応、xmlbeans 2.6.0の
NullPointerExceptionの発生箇所のソースを貼っておきます。
バージョンが違うのでリンク元とは行数が違いますが、
逆にkuxwaxさんの結果とは一致します。

lang

166 static 267 { 368 ClassLoader cl = Path.class.getClassLoader(); 469 String id = "META-INF/services/org.apache.xmlbeans.impl.store.PathDelegate.SelectPathInterface"; 570 InputStream in = cl.getResourceAsStream(id);

これの70行目でNullPointerExceptionなので、clがnullのとき、
つまりPath.class.getClassLoader()がnull、
ということはPathクラスがブートストラップクラスローダーにロードされた、
ということです。

投稿2015/07/17 14:11

編集2015/07/17 14:22
eripong

総合スコア1546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eripong

2015/07/17 14:22

該当箇所のソースと、説明を追記しました。
argius

2015/07/17 14:39

ユーザーライブラリー"POI"をシステムライブラリーに設定して実行したところ、質問者さんと同じエラーが再現しました。 お見事です。
eripong

2015/07/17 14:48 編集

確認ありがとうございます。 以前も確認していただきましたね。 動作確認できない状況の場合が多いので助かります。
kuxwax

2015/07/17 19:39

ユーザーライブラリのチェックが入っていて外すと正常に動きました!! 本当にありがとうございます!! もうあきらめかけていた所だったのですごく助かりました。
guest

0

ExceptionInInitializerError.getCause().printStackTrace() で根本の原因が特定できるそうです。
試してみてはいかがでしょうか?

java

1 2} catch (Exception e1) { 3e1.printStackTrace(); 4} catch(ExceptionInInitializerError error){ 5 errori.getCause().printStackTrace(); 6} 7 8(参考サイトより抜粋)

参考:【QA@IT】ExceptionInInitializerErrorが出てしまいます。

投稿2015/07/17 02:11

kaputaros

総合スコア1844

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuxwax

2015/07/17 13:54

回答ありがとうございます。
guest

0

eripongさんの回答が完璧なのでこの回答は消しておきます。

元の内容を見るには履歴を参照してください。

投稿2015/07/17 13:50

編集2015/07/17 14:37
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuxwax

2015/07/17 13:56

いえいえ、わざわざありがとうございます。 もう少しいろいろ調べてみようと思います。
argius

2015/07/17 14:17

原因とは直接関係ないかも知れませんが、NullPointerExceptionの箇所について追記しました。
eripong

2015/07/17 14:23

自分の回答に書きましたが、xmlbeans 2.6.0のソースを見ると、 行数が一致しています。
argius

2015/07/17 14:38

eripongさん 失礼しました。 trunkのソースの行番号を見ていました。 ご指摘ありがとうございます。
guest

0

こんばんわ。

私の環境で上記ロジックをそのまま実行してみましたが、
正常にファイルが作成できましたのでお知らせしておきます。

Java8、POI関係は最新版のはずです。
環境が会社にあり、詳しいバージョン等は今は分かりません。

投稿2015/07/17 11:57

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuxwax

2015/07/17 13:55

ありがとうございます。 どうやら私以外はエラーは起こってないみたいですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問