NoSuchElementException错误Java

时间:2013-06-25 16:04:39

标签: java parsing error-handling io try-catch

我正在尝试从文件transactions.txt中读取,以下是transactions.txt中的内容:

Check # 13 : -200.00
Check # 14 : -100.00
Withdrawal June 12 : -200.00
Withdrawal June 17 : -400.00
Withdrawal June 23 : -100.00
Deposit : 4000.00
Deposit : 100.00
Something else : -1000.00
Check # 16 : -500.00
Check # 15 : -100.00

以下是我的代码:

import javax.swing.JOptionPane;
import java.text.DecimalFormat;
import javax.swing.JFrame;
import java.awt.Graphics;
import java.util.StringTokenizer;
import java.util.Scanner;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.FileNotFoundException;

public class Accounting extends JFrame
{
 private BankAccount bankAccount;

 public Accounting( )
 {
   bankAccount = new BankAccount( getBackground( ) );
   setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
   setSize( 300, 300 );
   setVisible( true );
 }

 public void balanceCheckBook( )
 {




    // ***** Write the body of this method *****
    //
    // Using a while loop, read the file transactions.txt
    // The file transactions.txt contains
    // transactions between you and your bank
    //
    //  You will need to call the animate method inside
    //  the body of the loop that reads the file contents
    //
    // The animate method takes three arguments:
    //    a String, representing the type of transaction
    //    a double, representing the transaction money amount
    //    a double, representing the new checkbook balance
    // So if these three variables are:
    //     transactionName, currentAmount, and balance,
    //  then the call to animate will be:
    //
    //  animate( transactionName, currentAmount, balance );
    //
    // You should make that call in the body of your while
    // loop, after you have updated the checkbook balance
    //

    double balance = 0.00;
    double currentAmount;
    String nextLine;
    StringTokenizer st;
    String transactionName;
    Scanner scan = null;


    scan = new Scanner (new FileReader("transactions.txt"));

    Scanner callParse;
    String trans;
    while ((trans = scan.nextLine()) != null )
    {
        scan.useDelimiter(":");
        callParse = new Scanner(trans);
        callParse.useDelimiter(":");
    }


 }

 public void animate( String currentTransaction, double currentAmount, double currentBalance )
 {
   // set the current transaction in the bankAccount object
   if ( currentTransaction.startsWith( "Ch" ) )
       bankAccount.setCurrentTransaction( new Check(currentAmount ) );
   else if ( currentTransaction.startsWith( "With" ) )
       bankAccount.setCurrentTransaction( new Withdrawal(currentAmount ) );
   else if ( currentTransaction.startsWith( "Dep" ) )
       bankAccount.setCurrentTransaction( new Deposit(currentAmount ) );
   else
       bankAccount.setCurrentTransaction( new UnknownTransaction(currentAmount ) );

   // set the currentBalance data member in the bankAccount object
   bankAccount.updateBalance( currentBalance );

   repaint( );
   try
   {
    Thread.sleep( 3000 );  // wait for the animation to finish
   }
   catch ( Exception e )
   {
   }
 }

 public void paint( Graphics g )
 {
   super.paint( g );
   bankAccount.draw( g );
 }

 public static void main( String [] args )
 {
   Accounting app = new Accounting( );
   app.balanceCheckBook( );
 }
}

我收到错误:

scan = new Scanner (new FileReader("transactions.txt"));

另外,当我运行代码时,它告诉我:

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Unknown Source)
    at Accounting.balanceCheckBook(Accounting.java:73)
    at Accounting.main(Accounting.java:119)

我该怎么做才能解决这些错误?

2 个答案:

答案 0 :(得分:2)

您需要使用Scaner.hasNextLine检查扫描仪是否有下一行。

顺便说一下,Java文档在解释抛出特定异常的原因方面通常太棒了。对于Scanner.nextLine,文档报告:

  

抛出:

     
      
  • NoSuchElementException - 如果没有找到行
  •   

始终查看Java文档!

答案 1 :(得分:0)

将其更改为:

  while (scan.hasNextLine())
    {
        trans = scan.nextLine();
        scan.useDelimiter(":");
        callParse = new Scanner(trans);
        callParse.useDelimiter(":");

    }

然后它应该正常工作