0

こんにちは、仲間のプログラマー。私を困惑させている別の問題があります。ユーザーからの入力を受信しようとしていますが、常に「java.util.NoSuchElementException: No line found」が表示されます。検索したすべての方法を試しましたが、うまくいきませんでした。これが私のコードです:

import java.util.Scanner;
import java.io.*;

public class UserLog {
    static String username;
    static String password;
    static String passcompare;
    static File name;
    static String Userfile = "username-";
    static String Passfile = "password-";

    public static void main(String[] args) {
        menu();
    }

    public static void menu(){
        boolean call = false;
        try (Scanner in = new Scanner(System.in)) {
            do {
                System.out.println("Select an option: ");
                System.out.println("1: New account \n"
                                 + "2: Existing account");
                System.out.print("-");
                int choice = in.nextInt();
                in.nextLine();

                 switch(choice) {
                     case 1:
                         call = true;
                         System.out.println("\nNew account called\n");
                         userCreate();
                         break;
                     case 2:
                         call = true;
                         System.out.println("\nExisting account called\n");
                         login();
                         break;
                     default:
                         System.out.println("\nNot a valid option\n");
                 }
            } while(!call);
            in.close();
        }
        catch(Exception ex) {
            System.out.println("Exception Text: " + ex);
        }
    }

    static void login(){       
        try (Scanner in = new Scanner(System.in)) {
            System.out.println("LOGIN SCREEN\n");
            System.out.print("Username: ");

            username = in.nextLine();
            name = new File("user-" + username + ".txt");
            if(name.exists()) {
                System.out.println("Username exists");

                System.out.print("Password: ");

                password = in.nextLine();
                //scans userfile for password
                if(password.length() != 0 && password.length() >= 8 /* and password-username match */) {
                    System.out.println("Login successful");
                    in.close();
                }
            }

            else {
                System.out.println("Username doesn't exist in system");
                System.out.println("Would you like to create this user? (y/n)");
                System.out.print("-");

                char choice = (char)System.in.read();

                switch(choice) {
                    case 'Y':
                    case 'y':
                        System.out.println("Creating user " + username);
                        name = new File("user-" + username + ".txt");
                        name.createNewFile();
                        System.out.println("User created");
                        passCreate(name);
                        in.close();
                        break;
                    case 'N':
                    case 'n':
                        System.out.println("Denied creation of user");
                        in.close();
                        break;
                    default:
                        System.out.println();
                }
            }
            in.close();
        } catch (IOException ex) {
            System.out.println("Exception Text: " + ex);
        }
    }

    private static File nameCreate() {
        try (Scanner user = new Scanner(System.in)) {
            System.out.print("Enter Username: ");

            username = user.nextLine();
            name = new File("user-" + username + ".txt");

            if(!name.exists()) {
                name.createNewFile();
                try (FileWriter fw = new FileWriter(name)) {
                        fw.write(Userfile + username + "\n");
                        fw.write(Passfile);
                        fw.flush();
                        fw.close();
                }
                catch(Exception ex) {
                    System.out.println("Exception Text: " + ex);
                }

                //puts lines of text in the file-
                //username-"username"
                //password-
                //
                System.out.println("User Created\n");
            }
            else if(name.exists()) {
                System.out.println("User already exists\n");
                nameCreate();
            }
            user.close();
        }
        catch(Exception ex) {
            System.out.println("Exception Text: " + ex);
        }
        return name;
    }

    private static void passCreate(File user) {
        username = user.toString();
        System.out.println(username + "\n");

        boolean code = false;

        try (Scanner pass = new Scanner(System.in)) {
            do{
                //opens file and reads until line "password-" and appends it with created password once confirmed
            System.out.println("Create a password");
            System.out.print("Password: ");
            password = pass.nextLine(); 

                if(password.length() >= 8) {
                    System.out.print("Confirm Password: ");
                    passcompare = pass.nextLine();

                    if(password.equals(passcompare)) {
                        code = true;
                        System.out.println("Passwords match\n");
                        //stores password
                    }
                    else {
                        System.out.println("Passwords don't match\n");
                    }   
               }
               else {
                   System.out.println("Password needs to be longer than 8 characters\n");
               }

            }while(!code);
            pass.close();
        }
        catch(Exception ex) {
            System.out.println("Exception Text: " + ex);
        }     
    }

    private static void userCreate() {
        nameCreate();
        passCreate(name);
    }
}

それは醜くて不完全であることはわかっていますが、この問題により、私はそれ以上進むことができませんでした. 既存のユーザー オプションを使用してその方法でユーザーを作成すると、パスワードを作成できますが、新しいユーザーを作成しようとすると、行なしの例外が発生します。私の質問は、スキャナーがパスワードを作成できるようにするために使用する行をさらに作成するにはどうすればよいか、またはこのタスクを完了するために他にどのようなオプションがあるかです。私は hasNextLine() を試しましたが、それが原因で、これ以上行がないことに気付きました。ありがとう

4

1 に答える 1

2

Scannerインスタンスを閉じると、基InputStreamになるものが閉じNoSuchElementExceptionられ、後続の読み取りで a がスローされます。Scanner後続の読み取りを失敗させたくない限り、閉じる必要はありません。

  • Scannerすべてのメソッドに使用される単一のインスタンスを作成します。
  • 閉じないでScanner
  • JavaはOO言語です。非staticメソッドを使用します。

結果:

public class UserLog {
   private String username;
   // more variables...

   private final Scanner in;

   public UserLog() {
      in = new Scanner(System.in);
   }

   public static void main(String[] args) {
      UserLog userLog = new UserLog();
      userLog.showMenu();
   }

   public void menu() {
      boolean call = false;

      do {
         try {
            System.out.println("Select an option: ");
            System.out.println("1: New account \n" + "2: Existing account");
            System.out.print("-");
            int choice = in.nextInt();
            in.nextLine();

            switch (choice) {
            case 1:
               call = true;
               System.out.println("\nNew account called\n");
               userCreate();
               break;
            case 2:
               call = true;
               System.out.println("\nExisting account called\n");
               login();
               break;
            default:
               System.out.println("\nNot a valid option\n");
            }

         } catch (InputMismatchException e) {
            System.out.println("Invalid option " + in.nextLine());
         }
      } while (!call);
   }
   ...
} 
于 2013-07-17T06:54:03.697 に答える