从文件中读取

时间:2012-10-19 21:06:00

标签: java

这个程序有两个带有main方法的类,应该从一个文件中读取。我的问题是,行double listPrice = fileScan.nextDouble();会出现错误异常,例如Exception in thread "main" java.util.InputMismatchException。错误发生在这个类中:

这是文件的内容:
本田雅阁

2004 16780.00 10.0

克莱斯勒SUV

2002 8600.00 0.0

丰田凯美瑞

2007 21799.99 3.0

福特Escort

2006 12345.78 5.5

//注意每行之间没有空格

class Proj1P2CarAryListService 
{

  private ArrayList<Proj1CarData> carList = new ArrayList<Proj1CarData>();

  public Proj1P2CarAryListService()
  {
     carList = new ArrayList<Proj1CarData>();
  }

  public void readStoreCarsData()
  {


     Scanner scan = new Scanner(System.in);

     Scanner fileScan;
     boolean validName = false;
     double discountAmount;
     double netPrice;

     do 
     {

        System.out.print("Enter file name: ");
        String str1 = scan.nextLine();

        try 
        {

           fileScan = new Scanner(new File(str1));
           validName = true;


           while (fileScan.hasNext())

           {

              String name = fileScan.nextLine();
              String modelYear = fileScan.next();
              double listPrice = fileScan.nextDouble();
              double percentDiscount = fileScan.nextDouble();

              discountAmount = listPrice * percentDiscount/100.0;
              netPrice = listPrice - discountAmount;

              Proj1CarData proj1 = new Proj1CarData(name, modelYear, listPrice, percentDiscount, discountAmount, netPrice);
              carList.add(proj1);
              System.out.println(proj1.toString());

           }// end while

        }// end try

           catch (FileNotFoundException fnfe)
           {
              System.out.println("Invalid File name; enter again");
           }

     } while (!validName);


  }//readStoreCarsData

3 个答案:

答案 0 :(得分:1)

扫描程序抛出此异常,表示检索到的令牌与预期类型的​​模式不匹配(Double必须用。分隔,或者像jlordo 一样),或者令牌超出预期类型的​​范围。也许这是一个文件内容问题。

答案 1 :(得分:1)

扫描程序的nextDouble()方法可识别区域设置(请参阅Documentation)。 这意味着,如果您的区域设置设置为“。”的国家/地区。将以下的浮点数分隔为可解析的double值:123.456,而后面的数字将为您提供InputMismatchException 123,456。在欧洲123,456会起作用,123.456会抛出异常。希望它有所帮助...

答案 2 :(得分:0)

您可能需要考虑打印每一行。你可能会得到比你想象的更多。