我为什么得到例外?

请帮忙。 从扫描程序的提示显示到控制台后,我收到此错误:

Exception in thread "main" java.util.IllegalFormatPrecisionException: 2 at java.util.Formatter$FormatSpecifier.checkInteger(Unknown Source) at java.util.Formatter$FormatSpecifier.(Unknown Source) at java.util.Formatter.parse(Unknown Source) at java.util.Formatter.format(Unknown Source) at java.io.PrintStream.format(Unknown Source) at java.io.PrintStream.printf(Unknown Source) at Project6.main(Project6.java:56) 

问题来自printf吗? 我检查了格式,看起来是对的。
这是程序:

 import javax.swing.JOptionPane; // allows for message dialog import java.util.Scanner; // allows for Scanner object to be used import java.text.DecimalFormat; // allows for formatting numbers public class Project6 { public static void main (String[] args) { final double LUXURYRATE = .2; // rate of luxury tax final double STATERATE = .1; // rate of state tax final double LABORRATE = .05; // rate of labor cost double diamondCost; // cost of diamond, value comes from the Scanner double settingCost; // cost of setting, value comes from the Scanner int numOrdered; // quantity ordered, value comes from the Scanner double baseCost ; //sum of the values in the variables for diamond and setting double totalCost; // total cost including tax double laborCost; // cost of labor double stateTax; // cost of state tax double luxuryTax; // cost of luxury tax double finalAmountDue; // total cost times quantity ordered DecimalFormat formatter = new DecimalFormat("$#,##0.00"); // money format Scanner input = new Scanner (System.in); // creates Scanner object System.out.print("Enter diamond cost:"); // prompts user diamondCost = input.nextDouble(); // converts input to double System.out.print("Enter setting cost:"); // prompts user settingCost = input.nextDouble(); // converts input to double System.out.print("Enter quantity:"); // prompts user numOrdered = input.nextInt(); // converts input to integer baseCost = diamondCost + settingCost; // calculates the cost before multiplication laborCost = calcExtraCost(LABORRATE , baseCost); // calls method calcExtraCost for calculation stateTax = calcExtraCost(STATERATE, baseCost); // calls method calcExtraCost for calculation luxuryTax = calcExtraCost(LUXURYRATE, baseCost); // calls method calcExtraCost for calculation totalCost = baseCost + laborCost + stateTax + luxuryTax; // total cost including tax and labor costs finalAmountDue = totalCost * numOrdered; // calculates total System.out.printf("Diamond Cost: $%,.2d \n", diamondCost); // displays bill to console System.out.printf("Setting Cost: $%,.2f \n", settingCost); System.out.printf("State Tax @ 10%: $%,.2f \n", stateTax); System.out.printf("Luxury Tax @ 20%: $%,.2f \n", luxuryTax); System.out.printf("Labor Charge @ $5% %,.2f \n", laborCost); System.out.printf("Total Price: $%,.2f \n" , totalCost); System.out.printf("Number Ordered: $%,.2d \n", numOrdered); System.out.printf("Amount Due: $%,.2f \n", finalAmountDue); JOptionPane.showMessageDialog(null, "Diamond Cost: " + formatter.format(diamondCost) + "\n" + "Setting Cost: " + formatter.format(settingCost) + "\n" + "State Tax @ 10%: " + formatter.format(stateTax) + "\n" + "Luxury Tax @ 20%: " + formatter.format(luxuryTax) + "\n" + "Labor Charge @ 5% " + formatter.format(laborCost) + "\n" + "Total Price: " + formatter.format(totalCost) + "\n" + "Number Ordered: " + formatter.format(numOrdered) + "\n" + "Amount Due: " + formatter.format(finalAmountDue) ); // displays bill in message dialog } // end method main public static double calcExtraCost (double RATE, double bcost) { double cost = RATE * bcost; // calculates extra cost return cost; // returns value of extra cost } // end method calcExtraCost } // end class Project6 

答:因为您的格式说明符与printf方法中使用的输入参数不匹配。

使用%f而不是%d作为double值的格式说明符字符

 System.out.printf("Diamond Cost: $%,.2f \n", diamondCost); ^ 

此外, %需要额外的%才能转义该字符

 System.out.printf("State Tax @ 10%%: $%,.2f \n", stateTax); 

最后,删除不必要的点字符

 System.out.printf("Number Ordered: $%,.2d \n", numOrdered); ^ 

阅读: Formatter javadoc