我在Java中格式化String时遇到了困难。我目前正在尝试做的是创建一个toString方法,它将以时钟格式打印出整数,如:12:09:05,其中12是小时,9是分钟,5是秒。 / p>
这是我的Clock类中的代码,我一直在尝试设置格式化String:
//toString Method
public String toString(){
String result = String.format("%02d:%02d:%02d"), hour, minute, second;
return result;
}//End toString
我遇到的问题是,当我运行驱动程序时,一切正常,直到我尝试打印出时钟对象。
System.out.println(clock1);
我得到了这个例外:
线程中的异常" main" java.util.MissingFormatArgumentException: 格式说明符'%02d'在 java.util.Formatter.format(Formatter.java:2519)at java.util.Formatter.format(Formatter.java:2455)at java.lang.String.format(String.java:2940)at Clock.toString(Clock.java:62)at java.lang.String.valueOf(String.java:2994)at java.io.PrintStream.println(PrintStream.java:821)at TestClock.main(TestClock.java:69)
我已经阅读过字符串格式,我从中得到的是它与printf几乎相同。如果我在printf语句中使用它,我的代码工作正常。我查看了互联网上的示例,但它们都使用整数而不是变量来显示格式。
我希望有人可以通过正确的方式执行字符串格式化来启发我吗?我见过人们使用Formatter.format而不是String.format。我还想知道是否需要调用我的访问器而不是尝试直接使用String中的变量?
答案 0 :(得分:7)
您需要将值作为参数传递给String.format()
:
String.format("%02d:%02d:%02d", hour, minute, second)
答案 1 :(得分:1)
String result = String.format("%02d:%02d:%02d"), hour, minute, second;
您实际上是在这里声明了4个String
变量:
result
,其值为String.format("%02d:%02d:%02d")
;此方法调用失败,因为另外需要传递3个整数参数; hour
,minute
和second
,未初始化且未使用。假设你有三个名为hour
,minute
和second
的整数成员变量,你放错了括号:hour, minute, second
需要进入括号:
String result = String.format("%02d:%02d:%02d", hour, minute, second);
答案 2 :(得分:1)
来自javadocs:
public static String format(String format, Object... args)
使用指定的格式字符串和返回格式化字符串 参数。
String.format(String format, Object... args)
在内部调用Formatter#format(Locale l, String format, Object ... args)
,其中使用了Local.getDefault()
Formatter#format(Locale l, String format, Object ... args)
具有此代码块,在您的情况下会产生异常。
case 0: // ordinary index
lasto++;
last = lasto;
if (args != null && lasto > args.length - 1)
throw new MissingFormatArgumentException(fs.toString());
fs.print((args == null ? null : args[lasto]), l);
break;
因为,您的案例中的args为null,因此您在MissingFormatArgumentException
上获得了%02d
。
请注意,这是您在FormatString[]
[0] - > %02D
[1] - > :
[2] - > %02D
[3] - > :
[4] - > %02D
因此,在索引0处,它会失败并抛出异常,你看。为了修复异常,您需要指定String#format(String, Object ...)
的参数,在您的情况下,这些参数在外部指定,因为您忘记在format
中传递它们。我可能会把它称为一个糟糕的设计,因为不应该允许null
个参数,并且函数应该抛出NullPointerException
消息Atleast one argument needs to be specified to format
,但这就是它。希望,作为我对社区的第一个回答,我已经提供了很多细节。
答案 3 :(得分:0)
您需要移动小时,分钟和第二个变量 INSIDE {{1}的参数}}
像:
String.format