PrintStream类型中的printf(String,Object [])方法不适用于参数(...)

时间:2011-10-14 22:57:50

标签: java

为什么通过简单调用printf会出现以下编译错误?我的代码:

import java.util.Scanner;

public class TestCodeBankAccInputs
{
    public static void main(String[] args)
    {
        String displayName = "Bank of America Checking";
        int balance = 100;
        System.out.printf("%s has %7.2f", displayName, balance);
    }
}

编译时出现以下错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
  The method printf(String, Object[]) in the type PrintStream is not applicable for the 
    arguments (String, String, double)
  at TestCodeBankAccInputs.main(TestCodeBankAccInputs.java:9)

造成这种情况的原因是什么?如何解决?

版本信息:

帮助 - >在Eclipse中关于提供以下信息:

面向Web开发人员的Eclipse Java EE IDE。

版本:Indigo Release 建造ID:20110615-0604

我安装的JDK是JDK1.6.0_27

我见过this similar issue regarding String.format。一些用户建议它可能是构建问题,但看起来我已经更新了版本。

4 个答案:

答案 0 :(得分:35)

检查项目的Compiler compliance level是否设置为至少1.5:

项目>属性> Java编译器

如果未设置Enable project specific settings,请使用该页面上的Configue Workspace Settings...链接检查全局Compiler compliance level

enter image description here

答案 1 :(得分:2)

这似乎很奇怪,它再次出现(与您链接的其他帖子相同)。我想知道最近版本的Eclipse中是否存在错误?那个帖子上的提问者再也没有回来了,所以我怀疑它可能刚刚消失了。你的代码完美无缺。如果我提供了一个合适的BankAccount类,它将在IntelliJ 10.5.2和命令行中编译并运行,如javacjava版本1.6.0_26:

import java.util.Scanner;

public class TestCodeBankAccInputs {
    public static void main(String[] args) {
        Scanner inStream = new Scanner(System.in);
        BankAccount myAccount = new BankAccount(100, "Bank of America Checking");
        System.out.print("Enter a amount: ");
        double newDeposit = inStream.nextDouble();
        myAccount.deposit(newDeposit);

        System.out.printf("%s has %9.2f", myAccount.displayName(), myAccount.getBalance());
        //System.out.printf("%3s", "abc");
    }

    static class BankAccount {

        private double balance;
        private String name;

        public BankAccount(double balance, String name) {
            this.balance = balance;
            this.name = name;
        }

        public String displayName() {
            return name;
        }

        public double getBalance() {
            return balance;
        }

        public void deposit(double newDeposit) {
            this.balance += newDeposit;
        }
    }
}

我仍然(正如我在其他帖子中所做的那样)推荐一个干净的构建,但是你在Eclipse中检查了你的编译器合规级别吗?您可以使用1.6 JDK进行编译,但仍然可以在IDE中设置较低的合规性级别,这可能会使有趣的事情发生。

答案 2 :(得分:1)

这样的临时修复可能会有效。

不使用printf,而是使用:

System.out.printf("%s has %7.2f", new Object[]{
    myAccount.displayName(), myAccount.getBalance()
} );

这可能会解决您的问题。

答案 3 :(得分:1)

使用:System.out.printf(arg0, arg1, arg2)代替System.out.printf(arg0, arg1)