formatメソッドについて

このQ&Aのポイント
  • formatメソッドは、指定された形式で数値や文字列をフォーマットするためのメソッドです。
  • 例えば、DecimalFormatクラスのformatメソッドを使用すると、整数や小数を指定した形式で表示することができます。
  • しかし、formatメソッドの引数には数値型のオブジェクトを渡す必要があります。文字列を渡すとエラーが発生します。
回答を見る
  • ベストアンサー

formatメソッドについて

こんばんは。皆様、今回も宜しくお願い致します<(_ _)> 例えば1という値を渡したら、「001」というように表示させてたくて、下記のようなソースを作成してみました。 import java.text.*; class Main{ public static void main(String args[]){ DecimalFormat fmt = new DecimalFormt(); fmt.setMaximumIntegerDigits(3); fmt.setMinimumIntegerDigits(3); String str = fmt.format(1); System.out.println(str); } } これを実行すると「001」というように、私の希望通りに表示されます。 でも String str = fmt.format(1); の部分を String str = fmt.format("1"); と変更すると下記のエラーが出力されます。 Exception in thread "main" java.lang.IllegalArgumentException: Cannot format giv en Object as a Number at java.text.NumberFormat.format(NumberFormat.java:219) at java.text.Format.format(Format.java:133) at Main.main(Main.java:8) そこでJavaのリファレンスを見て、疑問を持ちました。 リファレンスにはFormatクラスのformatメソッドの引数はオブジェクトになってます。 ということはむしろエラーになったほうが正しくて(String=オブジェクトだから)、普通に実行できたほうがおかしいんじゃないか?(数値=基本型だから)と思ったのです。 どうしてエラーがでるのか、どうしてオブジェクトを渡していないのに普通に実行できるのか、わかる方がいらっしゃったら教えて下さい。 宜しくお願い致します<(_ _)>

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#30871
noname#30871
回答No.1

 引数がObject型だからといって、あらゆるクラスをフォーマットしなければならないという決まりはありません。したがって、Stringを受け取らなければならない、というわけでもありません。  引数にどんなクラスを受け取れるのかは、Formatの実装クラスに任されています。実装クラスと書いたのは、Formatは抽象クラスだからです。  ためしに「new Long(1)」を渡すとどうなるでしょうか。  さて次に、format(1)のほうです。確かに、Formatクラスには基本型を受け取るformat()メソッドはありません。  しかし、fmtはFormatではなくてDecimalFormatです。  DecimalFormatはFormatの派生クラスであるNumberFormat型、さらにその派生クラスです。  NumberFormat型では、format(long)が定義されています。DecimalFormat型では、これを引き継いでいます。  したがって、format(1)と書くとformat(long)が適用されるのです。

makinko0129
質問者

お礼

書き込みしてくださり、ありがとうございました。 amajun様の答え、大変よく理解できました。 Formatクラスが抽象クラスというのも、amajun様に指摘されて今気付きました。 今回の私の悩みが解決したのはもちろんのことなのですが、その他に、クラスのextendsの大切さというか、リファレンスの追跡の仕方というか、今までよくわからなかったことがかなり明確になった感じです。 お忙しい中、本当にありがとうございました<(_ _)>

関連するQ&A

  • javaの実行時のエラー

    javaを使って圧縮プログラムを作ったのですがコンパイルは通るのに実行時に Exception in thread "main"java.lang.StringIndexOutOfBoundsException: String index out of range: 80 at java.lang.String.charAt(String.java:455) at ashuku.char1(ashuku.java:51) at ashuku.kensa1(ashuku.java:23) at ashuku.main(ashuku.java:9) というエラーが出ます。このエラーの意味は何なのですか?教えてください。プログラムが長くて載せられないので、このエラーが出たときに何をチェックすればいいか教えてもらえると助かります。お願いします

    • ベストアンサー
    • Java
  • 動くプログラムと動かないプログラム

    senをつかってプログラムを実行したところ import java.io.IOException; import net.java.sen.StringTagger; import net.java.sen.Token; public class SenSample { public static void main(String[] args) throws IllegalArgumentException, IOException { System.setProperty("sen.home","c:/sen"); StringTagger tagger = StringTagger.getInstance(); String str = "私の名前を当ててください"; Token[] token = tagger.analyze(str); for(int i=0; i<token.length; i++){ System.out.println(token[i].getBasicString() +"("+token[i].getTermInfo()+")"); } } } は動きましたが、 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Locale; import net.java.sen.StringTagger; import net.java.sen.Token; public class StringTaggerDemo { public static void main(String args[]) { try { <中略> } } } は動きません 結果↓ C:\java>java StringTaggerDemo done. Please input Japanese sentence: java.lang.IllegalArgumentException: C:\java\null\conf\sen.xml (指定されたパスが 見つかりません。) at net.java.sen.StringTagger.readConfig(StringTagger.java:304) at net.java.sen.StringTagger.init(StringTagger.java:145) at <中略>net.java.sen.StringTagger.getInstance(StringTagger.java:113) at StringTaggerDemo.main(StringTaggerDemo.java:13) -- Press any key to exit (Input "c" to continue) -- となります。 違いは何ですか??

    • ベストアンサー
    • Java
  • String.formatの使い方

    JavaでString.formatを使いたいですが、書式指定のしかたがよくわかりません。 下記ソースの時、 java.util.MissingFormatArgumentExceptionエラーとなりますが、 どうしたらエラーとならないように正常にできますか? String format = "%1$-6.6s%2$-4.4s"; Object data = "AAAAAA, 1234"; System.out.println(String.format(format, data));

    • ベストアンサー
    • Java
  • JAVAでエラーがでる。

    JAVA初心者なのですが、下のプログラムは数値を入力して、それを表示させるという簡単なプログラムなのですが、実行すると、 String str = br.readLine(); のbr.readLine();の部分に赤い波線が出て、 「処理されない例外の型 IOException at B.main(B.java:11)」 というエラーが出てしまってこまっています。 参考書のとうりに入力しているのになぜでしょうか? タブやスペースが使えないので見にくくなってしまってすみません。 どなたかJAVAに詳しい方 教えてください。 import java.io.*; public class B { public static void main(String[] args) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int num = Integer.parseInt(str); System.out.println(num + "が入力されまた。"); } }

    • ベストアンサー
    • Java
  • [JAVA]ProcessBuilderで「java -version」を実行できない

    以下のプログラムで「java -version」を実行しようとするとエラーになります。「java」だけですと実行できますが「-version」をつけるとエラーになります。 ---プログラムの内容--- import java.io.*; public class test4518 { public static void main(String[] args) throws Throwable{ ProcessBuilder pb = new ProcessBuilder(new String[]{"java -version"}); Process p = pb.start(); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } } ーーーエラーの内容ーーー Exception in thread "main" java.io.IOException: CreateProcess: "java -version" error=2 at java.lang.ProcessImpl.create(Native Method) at java.lang.ProcessImpl.<init>(Unknown Source) at java.lang.ProcessImpl.start(Unknown Source) at java.lang.ProcessBuilder.start(Unknown Source) at test4518.main(test4518.java:5)

    • ベストアンサー
    • Java
  • mainメソッドに関して

    こんばんは。宜しくお願いします。 例えば2つのファイルhello.javaとtnk.javaがあった とき hello.java⇒HL.class(デフォルト)、mainメソッド(1) tnk.java⇒tnk.class(public)(2) の構成をとっているとします。 このHL.classのmainメソッドから、tnk.classの何か メソッド(public)を呼んで実行するとします。 このときに、tnk.classはHL.classとは別ファイルです からpublicでなくてはいけないのは分かります。 ですが、始まりであるmainメソッドを持つクラスは デフォルトでもよいのはどうしてなのか悩んで います。 (因みに、hello.javaのHL.classをHello.javaとして コンパイル・実行すると、wrong nameとエラーが出、 hello.javaのmainメソッドを持つクラスを一端 public class hello としてコンパイル・実行して やらないと、(1)に戻しても正常に実行できなくなる のも不思議です) 仕様と言ってしまったらそうかもしれませんが、 ご存知の方がおりましたら、ご教授くださいますよう お願いします。

    • ベストアンサー
    • Java
  • 初心者です。splitメソッドで、NoSuchMethodErrorが出ます。

    こんにちは。 Javaの初心者です。 csvファイルから1行ずつ読み込み、それをsplitで配列に入れて 特定の文字を出力する、といったことをしたいと思っています。 ソースは以下のとおりです。 import java.lang.*; import java.io.*; public class TestJava { public static void main(String[] args) { try { BufferedReader br = new BufferedReader (new FileReader("in.csv")); BufferedWriter bw = new BufferedWriter(new FileWriter("out.csv")); String line = null; while ((line = br.readLine()) != null) { String[] inArray = line.split(","); String s = inArray[0].substring(2, 3); System.out.println (s); bw.write(line); bw.newLine(); } bw.flush(); br.close(); bw.close(); } catch (IOException e) { e.printStackTrace (); System.exit(-1); } } } コンパイルは通るのですが、実行すると、 C:\java\src>java TestJava Exception in thread "main" java.lang.NoSuchMethodError at TestJava.main(TestJava.java:19) というエラーが出てしまいます。 (19行目は、String[] inArray = line.split(",");の部分です) ネットで調べてみると、mainメソッドの書き方が間違っているのでは、 とあったので、何度も注意深く見てみたのですが mainメソッドに間違いはないように思えます。 また、クラスパスが通ってないのでは、ともあったのですが、 環境変数のclasspathに「C:\java\src」を設定しています。 どなたか分かる方いらっしゃいましたら、 ご教授いただけませんでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Java
  • javaでscalaのクラスを使う

     Scala初心者です^^  Scalaで作ったクラスをJavaで使おうとしています.  しかしなかなかうまくいかなくて…  ソースを下に書いておきます. [ap/hello.scala] class hello(str2: String){ val str = str2 def say(){ println(str) } } [ap/start.java] public class start{ public static void main(String[] args){ hello h = new hello("Hello!"); h.say(); } }  helloクラスのコンストラクタを用いて指定した文字列を helloクラスのsayメソッドで標準出力するだけの簡単なクラスなのですが, うまく実行できず… Exception in thread "main" java.lang.NoClassDefFoundError: ap/start/class Caused by: java.lang.ClassNotFoundException: ap.start.class at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) Kazus-MackBookPro:ScalaLearning macuser$ java ap/start Exception in thread "main" java.lang.NoClassDefFoundError: ap/start (wrong name: start) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) at java.lang.ClassLoader.defineClass(ClassLoader.java:616) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) というエラーが出てしまいます.    どこが悪いかわかる方いらっしゃいませんか?  それとも,JavaではScalaで作った.classファイルは使うことができないのでしょうか?  Scalaはまだ覚えて2週間なので,まだ完全に理解できていません><    よろしくお願いします

  • Javaで配列を定義する方法

    こんにちは、片岡といいます。 Java言語で配列を定義する場合、以下の二つの書式に違いはありますか。 違いがあるとすれば、どのような違いですか。 また、違いがないのならば、どちらの記述がよいのですか。 ご存知の方はいらっしゃいませんか。 (1) public class Main1 { public static void main(String[] args) { String str[] = new String[] { new String("itiban"), new String("niban"), new String("sanban"), }; for (int i = 0; i < str.length; i++ ) { System.out.println(str[i]); } } } (2) public class Main2 { public static void main(String[] args) { String str[] = { new String("itiban"), new String("niban"), new String("sanban"), }; for (int i = 0; i < str.length; i++ ) { System.out.println(str[i]); } } } なお、私の環境は以下の通りです。 OS: Microsoft Windows XP Professional SP2 java: java version "1.4.2_13" 検索エンジンで"配列 オブジェクト java"を検索しましたが、 解決に役立つ情報は見つかりませんでした。

    • ベストアンサー
    • Java
  • 外部ライブラリについて

    Java初心者です・・。 eclipse上で、以下のソースで実行したところ、エラーになりました。 外部のライブラリを使用しているからかと思い、ビルド・パスを設定しました。 しかし・・・まだエラーが表示されます・・・。 どなたかご存知の方・・・アドバイスをお願いします。 [ソース] import javax.swing.*; import java.awt.*; class FusenExec { static public void main(String[] args) { String msg =JOptionPane.showInputDialog ("メッセージを入力して下さい。"); Dodai fusen = new Dodai(); JLabel label = new JLabel(msg); label.setOpaque(true); label.setBackground( Color.YELLOW); fusen.add(label); fusen.setSize(300, 50); fusen.setVisible(true); } } [エラー内容] Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) at java.net.URLClassLoader.access$100(URLClassLoader.java:56) at java.net.URLClassLoader$1.run(URLClassLoader.java:195) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at FusenExec.main(FusenExec.java:10)

    • ベストアンサー
    • Java

専門家に質問してみよう