简体   繁体   中英

ERROR Scanning textFile shows error “ Exception in thread ”AWT-EventQueue-0“ java.util.NoSuchElementException”

public class checkDuplicateNames1 {



public boolean checkDuplicateNames1(String name , String surname){
   boolean found = false;
    File file = new File("transactions.txt");

    try {
        Scanner sc = new Scanner(new File("transactions.txt"));
        sc.useDelimiter("/");


        while(sc.hasNext()){

        String userName = sc.next();
        String userLastName = sc.next();
        String userCash = sc.next();
        String paidStatus = sc.next();

        if((userName.equals(name)&&userLastName.equals(surname))){

            found = true;

        }
        else
        {

            found = false;
        }
        }

    } catch (FileNotFoundException ex) {
        Logger.getLogger(checkDuplicateNames.class.getName()).log(Level.SEVERE, null, ex);
    }






 return found;



}

}

When i am in the point when i use the "boolean checkDuplicateNames1" method i get this error

Exception in thread "AWT-EventQueue-0" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1371)
at Lending.checkDuplicateNames1.checkDuplicateNames1(checkDuplicateNames1.java:41)
at Lending.Loan.jButton1ActionPerformed(Loan.java:250)
at Lending.Loan.access$200(Loan.java:24)
at Lending.Loan$3.actionPerformed(Loan.java:137)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6533)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6298)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)  

I tried to use different filereader like bufferedReader it's just the same ,

here's the "Loan class " method that uses "checDuplicateNames1" method

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    // TODO add your handling code here:


    String name = jTextField1.getText();
    String surname = jTextField4.getText();
    String cash = jTextField5.getText();
    System.out.println("loan clicked");

    try {

        String info = name + "/" + surname + "/" + cash + "/" + "unpaid";

        checkDuplicateNames1 c = new checkDuplicateNames1();
        boolean duplicated = c.checkDuplicateNames1(name,surname);

        if(duplicated == true){
            System.out.println("duplicated");
            this.currentName = name;
            this.currentSurname = surname;
          JOptionPane.showMessageDialog(null,"Person already in the Record ");
          wannaAddLoanValue w = new wannaAddLoanValue(name,surname,cash);
          w.show();



        }
        else
        {
            File file = new File("transactions.txt");
             PrintWriter writer = new PrintWriter(new FileWriter(file,true));
             String info1 = name + "/" + surname + "/" + cash + "/" + "unpaid";
             writer.println(info1); 
              writer.close();

        }



    } catch (FileNotFoundException ex) {
        Logger.getLogger(Loan.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(Loan.class.getName()).log(Level.SEVERE, null, ex);
    }




}                                

and Also the text in the file are like this

rodchris/toledo/200/unpaid
yannie/taub/890/unpaid

You should always call sc.hasNext() before sc.next(); .

while(sc.hasNext()){

    // This line is OK
    String userName = sc.next();

    // The following lines can cause NoSuchElementException
    String userLastName = sc.next();
    String userCash = sc.next();
    String paidStatus = sc.next();

checkDuplicateNames1() can be refactored as follows:

public boolean checkDuplicateNames1(String name, String surname) {
    boolean found = false;
    try (Scanner sc = new Scanner(new File("transactions.txt"))) {
        sc.useDelimiter("/");
        String userName = sc.hasNext() ? sc.next() : null;
        String userLastName = sc.hasNext() ? sc.next() : null;
        return userName != null && userLastName != null && userName.equals(name) && userLastName.equals(surname);            
    } catch (FileNotFoundException ex) {
        Logger.getLogger(checkDuplicateNames.class.getName()).log(Level.SEVERE, null, ex);
    }
    return found;
}

which line in ur class is 41 ? ie which next() causes the error,

i think hasNext() considers the whole current input as 1 token, but when you call next() several times, you got only first 1 then the exception, to fix this i think you have to check for hasNext() before each next()

while(sc.hasNext()){
    String userName="",userLastName="",userCash="",paidStatus="";

    //first one already checked in while(...)
    userName = sc.next();

    if(sc.hasNext())        
        userLastName = sc.next();

    if(sc.hasNext())
        userCash = sc.next();

    if(sc.hasNext())
        paidStatus = sc.next();

    //... rest of code

in the rest of your code you may want to check each variable is empty

if(!userLastName.isEmpty()) ...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM