2015-10-07 34 views
0

我該如何去詢問一個字符串輸入,然後提取0字符? 我正在使用「fstream.next()」,它會輸入任何內容,而不僅僅是一個字符串。 我只需要一個字符,我可以稍後在循環中使用該程序只接受T,D和E的字符輸入。如何以文本文件的形式讀取字符串並提取一個字符? 「0」

然後程序讀取double。然後程序用參數(char,double)調用實例方法。實例方法稍後做它的事情並保存輸入。該程序稍後循環並重新執行。

當前我收到一個錯誤「java.util.InputMismatchException」。如果你能提供建議,我將不勝感激!如果需要澄清,請告訴我。先謝謝你! :)

這裏是我的代碼:

/** holds answer of whether user has more inputs or not */ 
    String answer; 
    /** holds the results when calling inLetter() */ 
    char letter; 
    /** holds the results when checking for types/strings in txt file */ 
    String inType = ""; 
    /** holds double results when searching line by line the text file */ 
    double inAmount = 0; 
    /** holds the results when calling inAmount() */ 
    double amount; 
    /** initiates infile to null */ 
    File infile = null; 
    /** count system for how many valid lines were read and used */ 
    int count = 0; 

    /** calls description method */ 
    description(); 
    /** initiates new Object */ 
    GironEventClass newInput = new GironEventClass(); 
    try{ 
     /** defines new variable linked to .dat file */ 
     infile = new File("GironEvent.dat"); 
     /** calls fstream scanner - for use on file */ 
     Scanner fstream = new Scanner(infile); 

     /** calls while loop. As long as there is a line, the loop continues */ 
     while(fstream.hasNext()) 
     { 
      /** inputs first string in line of file to variable inType */ 
      inType = fstream.nextLine(); 
      char a_char = inType.charAt(0); 

      /** inputs first int in line of file to variable inAmount */ 
      inAmount = fstream.nextDouble(); 

      try{ 
       /** calls instance method with two parameters */ 
       newInput.donations(a_char, inAmount); 
       /** count ticket increases */ 
       count+=1; 

      } 
      catch(IllegalArgumentException a){ 
       /** prints out error if exception is caught*/ 
       System.out.println("Just caught an illegal argument exception. "); 
      } 

      } 
     /** closes stream between program and fiel */ 
     fstream.close(); 

     /** outputs line count, and totals per type */ 
     System.out.println("\n" + count + " number of valid lines were read!\n"); 
     System.out.println("Total Sales: " + newInput.getSale()); 
     System.out.println("Donations: " + newInput.getDonated()); 
     System.out.println("Expenses: " + newInput.getExpenses()); 
    } 

    catch (FileNotFoundException e){ 
     /** Outputs error if file cannot be opened. */ 
     System.out.println("\nGironEvent.dat could not be opened. "); 
    } 

    do{ 
     /** loop asks user if there is more that needs to be added to the totals. N exits loop. */ 
     System.out.print("\nAre there any more items to add that were not in the text file? (Type 'Y' or 'N'): "); 
     answer = keyboard.next(); 
     if (("Y".equals(answer)) || ("y".equals(answer))) 
     { 
      letter = inLetter(); 
      amount = inAmount(); 

      newInput.donations(letter, amount); 
     } 

    }while (("Y".equals(answer)) || ("y".equals(answer))); 
    /** calls instance method to display totals in a fancy manner */ 
    newInput.display(); 
} 

/** inLetter - displays types to user. Asks user to input type. Converts input into uppercase letter. 
* 
* @return resultTwo - Uppercase form of result. Result is the type the user inputted. 
*/ 
public static char inLetter(){ 
    Scanner keyboard = new Scanner(System.in); 
    String result; 
    String resultTwo; 

    System.out.println("T = Tiket Sales"); 
    System.out.println("D = Donations"); 
    System.out.println("E = Expenses"); 
    System.out.print("Please input an identifier "); 
    result = keyboard.nextLine(); 
    resultTwo = result.toUpperCase(); 

    return resultTwo;  
} 

/** inAmount - asks user for amount. Tests that amount isn't a negative number or a zero. 
* 
* @return result - the amount the user inputed. regardless if it was the first or tenth time. 
*/ 
public static double inAmount(){ 
    Scanner keyboard = new Scanner(System.in); 
    double result; 

    System.out.println("Please input an amount "); 
    result = keyboard.nextDouble(); 

    if(result <= 0){ 
     System.out.print("Please input a positive and non-zero amount "); 
     result = keyboard.nextDouble(); 
    } 

    return result; 
} 
/** description - displays a description of what the program does 
* void. 
*/ 
public static void description(){ 
    System.out.println("The program will ask you what amount is being spent on what."); 
    System.out.println(" ex: expenses, ticket sales, and profts."); 
    System.out.println("This program will help determine whether the event generated or lost money.");  
} 

我需要以下塊援助:

/** inputs first string in line of file to variable inType */ 
      inType = fstream.nextLine(); 
      char a_char = inType.charAt(0); 

      /** inputs first int in line of file to variable inAmount */ 
      inAmount = fstream.nextDouble(); 

回答

1

你fstream的是有字符串和雙的組合。

所以,當你使用fstream.nextDouble()它拋出java.util.InputMismatchException

參考:http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextDouble()

您可以先檢查下一個字符是否是兩倍或不與方法hasNextDouble()

參考: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNextDouble()

+0

非常感謝你的迴應克萊門特。我一回家就會嘗試。只是澄清一下,使用fstream時,你只能有一種輸入嗎?例如,只是雙打,或只是整數,或只是字符串?你不能有兩者的結合?謝謝! – Manny

+0

您可以使用Double,Int和String的組合,但在解析時需要小心。如果你確定你的數據只有Double,那麼我們可以使用nextDouble()。 –

+0

我明白了!請求fstream字符串,然後解析爲char和/或double,並將其記錄到一個變量中。我現在明白了!謝謝克萊門特。讓我測試一下,我會給你複選標記。 :) – Manny

相關問題