【问题标题】:How to use String.format in java 8?如何在 java 8 中使用 String.format?
【发布时间】:2015-05-25 13:58:00
【问题描述】:

今天我用java 8在eclipse Kepler中写了一个简单的程序。实际上,我是从一些视频教程中复制的。在那个教程中,它运行了,但在我的电脑上却没有。错误行是

 String.format("%02d:%02d:%02d",hour,minute,second);

我不明白这里的错误是什么。 它突出了String类型中的方法format(String,object[])不适用于argument(String, int, int, int)

public class Demo {

private int hour;
    private int second;
    private int minute;

    public void setTime(int h,int m,int s){
        hour=((h>=0 && h<24)?h:0);
        minute=((m>=0 && m<60)?m:0);
        second=((s>=0 && s<60)?s:0);
    }

    public String railwayTime(){
        return String.format("%02d:%02d:%02d",hour,minute,second);//error in this line
    }

    public String regular(){
        return String.format("%02d:%02d:%02d %s",((hour==0 ||hour==24)?12:(hour%12)), minute, second, (hour>=12)?"AM":"PM");//error in this line
    }
}

public class ShowTime {
    public static void main(String[] args){
        Demo d=new Demo();
        System.out.println(d.railwayTime());
        System.out.println(d.regular());
    }
}

【问题讨论】:

  • 如例外所述,您必须将格式化参数作为数组提供,而不是作为单个参数提供。
  • 这里使用 Java 8。我无法重现此错误。您认为您可以向我们展示更多代码吗?你确定你也在使用 Java 8 吗?
  • String.format 是在 Java 5 中引入的,从那时起它接受Object...,我只是不明白 ypu 是如何滥用标准库来获得这个结果的。
  • 阅读此内容:What is "compiler compliance level" in Eclipse?,将您的级别设置为 java 8,然后开心。

标签: java string java-8


【解决方案1】:

异常要求您提供数组而不是逗号分隔的字符串:

// incorrect
String.format("%02d:%02d:%02d",hour,minute,second);

// fast but correct
Object[] data = { hour, minute, second };
String.format("%02d:%02d:%02d", data);

但实际上,String 中不存在方法format(String,object[]),它是:format(String pattern, Object... arguments) 应该使用逗号,。您的语法有问题,但显示的代码中没有。

【讨论】:

  • String data -> String[] data
  • 另外,hourminutesecond 肯定是 ints,所以这不会编译。您应该将data 创建为Object[] data = ...
  • @rajeevranjan 之前的合规级别设置是什么,导致出现您看到的错误?
  • @StuartMarks 最有可能是 Java 1.4。在某些 IDE 中,如果您不定义其他内容,这是标准级别。
  • @Tom 是的,如果不支持可变参数,它必须是 1.4。但是 Eclipse Kepler(2013 年发布)的默认值真的是 1.4(2002 年发布)吗?
【解决方案2】:

这个问题的真正答案只有你的 int 类型。 您不必专门使用 Object,但必须使用从 Object 继承的类型,并且 int 是不从 Object 继承的原始类型,就像所有原始类型一样。 所以你可以使用 Integer 而不是 int 来解决你的问题。

【讨论】:

    【解决方案3】:

    我知道这是旧的,但我有一个猜测。

    private int hour;
    private int second;
    private int minute;
    

    如上所述,您将 hoursecondminute 声明为 int 类型,这是一种原始数据类型,与 Object 类型不兼容。

    您可能想将它们更改为:

    private Integer hour;
    private Integer second;
    private Integer minute;
    

    Integer 是基本类型int 的包装器,用于将其对象化。 到那时,String.format("%02d:%02d:%02d",hour,minute,second); 行应该可以正常工作了。

    【讨论】:

      猜你喜欢
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      相关资源
      最近更新 更多