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

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

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

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

Q&A

2回答

8220閲覧

unknownformatconversionexceptionについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

1クリップ

投稿2015/11/30 06:10

javaでunknownformatconversionexceptionが発生してしまっています。

SQLにバインド変数で前の処理で使用したSQLの結果を次のSQLに使用したいのですが
その際に、inの中身の成型などで以下の処理を使用しています。

// inの中身を整形("?"の数を揃える)
String[] tmpParam = new String[condList.size()];
for (int cnt = 0, max = condList.size(); cnt < max; cnt++) {
tmpParam[cnt] = "?";
}
addSql = StringUtils.join(tmpParam, ",");
strSql = String.format(strSql, addSql);←logではここでエラーが発生している。

実行した際に、以下のExceptionが出力されました。
java.util.UnknownFormatConversionException: Conversion = '''

調べてみたのですが、このExceptionの原因追及などできているものが確認できず、詰まってしまっています。
わかる方いましたら、どのようなことが原因と考えられるかご教授いただければと思います。

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

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

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

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

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

guest

回答2

0

このページにはこう書いてあります。

変換、日付/時刻変換の接尾辞、またはフラグとして明示的に宣言されていない文字はすべて不正であり、将来の機能拡張に備えて予約されています。書式文字列内でこの種の文字を使用すると、UnknownFormatConversionExceptionまたはUnknownFormatFlagsExceptionがスローされます。

原因になっているのはこれはシングルクォーテーションでしょうか?

投稿2015/11/30 06:21

swordone

総合スコア20649

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

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

退会済みユーザー

退会済みユーザー

2015/11/30 06:28

そうですね、シングルクォーテーションになります。 初めて見たExceptionでかなり戸惑ってしまいました…
swordone

2015/11/30 06:33

例外の場所がわかっているのであれば、例外を発しているメソッドを調べれば大体原因がわかります。 例外クラスも調べてみると、String.formatが投げる可能性のあるIllegalFormatExceptionのサブクラスだとわかります。
guest

0

String.formatメソッドの使い方が根本的に誤っているように見えます。

formatメソッドは、第1引数にフォーマット文字列を指定します。
この場合、おそらくstrSqlには空文字列が設定されていますので、フォーマットが存在せず、エラーになっています。


(追記)

フォーマット文字列に変数を使用するのは、このような問題を発生させることが多くなるので、避けた方が賢明です。余程複雑なことをするのであれば話は別ですが、そうでなければさけたほうが良いです。
Javaに限らず、フォーマット文字列を変数にしてしまうことで問題が発生したケースを良く耳にしました。

せめて、第2引数でstrSqlを指定するようにできないでしょうか?

最終的にどうしたいのかが分からないので勘ですが、こんな感じです。

lang

1strSql = String.format("%s in (%s)", strSql, addSql);

追記ここまで


formatメソッドは、下記のようにして使用するものです。

lang

1String s = String.format("[%d], [%d]", 1, 2); 2// [1], [2]

参考リンク:
String.formatメソッド - Java SE 8 API ドキュメント
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#format-java.lang.String-java.lang.Object...-

投稿2015/11/30 06:18

編集2015/11/30 13:29
argius

総合スコア9388

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

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

退会済みユーザー

退会済みユーザー

2015/11/30 06:32

すみません。記載不足がありました。 前処理で String sqlPath = 使用するSQLのファイルパス指定; ECDEZzcFileAccess fileAcc = new ECDEZzcFileAccess(); String strSql = fileAcc.readFile(sqlPath); String addSql = null; こちらが入っているため、strSqlは空でないと思ってはいるのですがね…
argius

2015/11/30 06:40

空かどうかは重要ではありません。私は誤認しましたが、実際はswordoneさんのおっしゃるとおりシングルクォートが入っているようですね。 いずれにしても、フォーマットとしては不適切だと思います。
退会済みユーザー

退会済みユーザー

2015/11/30 12:42

SQL全文読み込みでシングルクォートが入っていることによって生じているということですかね? パラメータを与える部分のみ読ませるようにすれば回避できるのでしょうか?
argius

2015/11/30 12:54

ここ↓で、 strSql = String.format(strSql, addSql); 第1引数にはフォーマット文字列を指定するべきなんです。 でも、strSqlはフォーマット文字列ではありませんよね?
KiyoshiMotoki

2015/11/30 13:03

daichaso0307様、argius様、横から失礼します。 daichaso0307様、変数strSqlに代入している値を提示されてはいかがでしょうか? そうすれば、どう修正すれば良いか具体的に指摘することができますので。
argius

2015/11/30 13:13

KiyoshiMotokiさん ご支援ありがとうございます。 私の考えでは、daichaso0307さんは何か勘違いをされていると思いましたので、変数strSqlに設定されている変数については敢えて触れませんでした。 例え勘違いでないとしても、この場合はformat文字列としてstrSqlを使う方法はおそらく適切でないでしょう。
KiyoshiMotoki

2015/11/30 13:25

arguis様 なるほど、そういうことだったのですね。 横槍 失礼しました。
argius

2015/11/30 13:30

回答を一部編集しました。 KiyoshiMotokiさん とんでもありません。コメントありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問