2013-07-17 10 views
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(), и именно это заставило меня понять, что линий больше нет. Спасибо

+0

Можно только показать нам часть кода, которая имеет отношение к 'NoSuchElementException'? –

+0

Релевантно, и может ответить на ваш вопрос: http://stackoverflow.com/questions/13042008/java-util-nosuchelementexception-scanner-reading-user-input –

+0

да, но это происходит только при переходе через вариант 1 в начале программа. он находится в функции passCreate – TechnicalCustoms

ответ

2

Закрытие экземпляров Scanner приводит к закрытию оснований InputStream и вызывает выброс NoSuchElementException при последующих чтениях. Нет необходимости закрывать 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); 
    } 
    ... 
} 
+0

О, никогда не думал об этом. Итак, если мы используем сканер для чтения из System.in, мы не должны закрывать сканер, потому что основной поток тоже будет закрыт? – zEro

+0

правильный ........ – Reimeus

+0

В этом случае глупый вопрос: есть ли способ повторно инициализировать (повторно открыть) 'System.in' со стандартным входным потоком? – zEro

Смежные вопросы