Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

書式文字列について

始めまして。

format関数に関して、お聞きしたいと思います。

現在、エラーメッセージの多言語化をしているのですが、そこで躓いてしまいました。

例えば、class A というものを作り、そのインスタンスメソッドとして、ある例外SomeExceptionを投げるメソッドmeth()を作ったとします。
つまり、

public class A {
    public void meth(int a, int b) throws SomeException{
        // do something
    }
}

となっています。
このときに、エラーメッセージを、日本語では、
「クラスAのメソッドmeth(int, int)で、ある例外SomeExceptionが発生しました。」
と表示させたいです。

英語版では、(気分的にであって、文法は目をつぶってください)
"An exception of SomeException is thrown at the method 'meth(int, int)' with some instance of class 'A'. "
としたいです。

ここで、書式文字列をそれぞれ
"クラス%2$sのメソッド%3$sで、ある例外%1$sが発生しました。"
"An exception of %1$s is thrown at the method \'%3$s\' with some instance of class \'%2$s\' "
とし、あてはめる値を
"SomeException", "A", "meth(int,int)"
とすれば、うまくいきそうなことが分かりました。

使い方としては、System.err.println(String.format(...))や
System.out.printf(...)等を考えています。

ここで、これらの書式文字列をプロパティファイルから取得したいのですが、固定文字列でないと、出力が失敗してしまいます。(定数ではなく変数を使用すると失敗するようです。)

書式文字列のようなものをコンパイル後に(比較的自由に)変更できる方法はないものでしょうか?


もちろん、正常に書式文字列の形式になっていないものがプロパティファイルから取得されてしまった場合の例外処理はきちんと行うつもりですが、
今回焦点を当てているのは、固定文字列でなくてもformat関数が使える方法が知りたいのです。


長文かつ、例が見にくいようなものを出してしまって、理解できない内容になっているかもしれませんが、
雰囲気だけでももしわかってくださって、対応方法がわかる方がいらっしゃいましたら、
ご教授をお願いしたいと思います。

よろしくお願いいたします。

3

回答

6825

閲覧

3件の回答

評価

30

>、固定文字列でないと、出力が失敗してしまいます。
(定数ではなく変数を使用すると失敗するようです。)
そんなことはありません。
普通に変数を使用してString#formatメソッドを呼び出
せます。
class A {
    public static void main(String[] args) {
        String message = "An exception of 
%1$s is thrown at the method \'%3$s\' with some 
instance of class \'%2$s\' ";

        
System.err.println(String.format(message, 
"SomeException", "A",
                "meth(int,int)"));
    }
}

An exception of SomeException is thrown at the 
method 'meth(int,int)' with some instance of class 
'A' 
と出力されます。
messageがプロパティから取得した値だろうと同じで
す。
他のところに問題があるのでは?

評価

0

ありがとうございます。

教えていただきましたコードは確かに実行できました。

もしかしたら、(もう何度も入れなおしている)eclipseの環境かもしれませんし、
書式文字列の入力でミスなり、問題があったのかもしれません。
(プロパティファイルの場合は、エンコーディングの問題だったのかもしれないですし。実際、日本語でしか試したことがなかったので。)

こんな、きちんと検証をしておけば問題のなかった質問をしてしまって、すみませんでした。

ありがとうございました。

評価

0

「機能Aを実行中にエラーBが検出されました。」
「An error B was detected while executing function A.」

のように、翻訳すると引数の順番が変わってしまうことがあ
る。

MessageFormatを調べると良いよ。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。