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.