NoSuchElementException: строка не найдена при получении пользовательского ввода со сканером? - PullRequest
4 голосов
/ 30 мая 2019

Я пытаюсь (просто сделать рейтинг фильмов более простым; сравнивать фильм, который вы добавляете с каждым другим фильмом в списке, чтобы узнать, где он подходит, сложно и не очень эффективно) сделатьпрограмма, которая работает как binary insertion sort, чтобы добавить фильм в список других фильмов в правильном порядке.В разделе, определяющем место в списке, куда должен идти фильм, я получаю сообщение об ошибке

Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.util.Scanner.nextLine(Unknown Source)
    at Rater.binarySearch(Rater.java:32)
    at Rater.main(Rater.java:24)

Я не уверен, что является причиной этого.Код ниже:

import java.awt.List;
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner; 
public class Rater 
{ 
  public static void main(String[] args)throws Exception 
  { 
      File file = new File("E:\\topmovies.txt"); 

      BufferedReader br = new BufferedReader(new FileReader(file)); 

      String st; 
      ArrayList<String> movList = new ArrayList<String>();
      while ((st = br.readLine()) != null) {
        movList.add(st);
      } 
      br.close();
      while(true) {
          System.out.println("Enter a movie to add.");
          Scanner myObj = new Scanner(System.in);
          String userName = myObj.nextLine(); 
          myObj.close();
          int index = binarySearch(movList, userName, 0, movList.size()-1);
          movList.add(index, userName);
      }
  }

  static int binarySearch(ArrayList<String> a, String item, int low, int high) 
  { 
      Scanner myObj3 = new Scanner(System.in);
      if (high <= low) { 
          System.out.println("Did you like " + item + " more than " + a.get(low) + "?");
          String answer2 = myObj3.nextLine().toLowerCase(); 
          myObj3.close();
          if(answer2.equals("yes")) {
              return low + 1;
          }
          return low;
      }

      int mid = (low + high)/2; 

      if(item == a.get(mid)) {
          myObj3.close();
          return mid+1; 
      }

      System.out.println("Did you like " + item + " more than " + a.get(mid) + "?");
      String answer2 = "";
      if(myObj3.hasNextLine()){
          answer2 = myObj3.nextLine().toLowerCase(); 
      }
      myObj3.close();
      if(answer2.equals("yes")) { 
          return binarySearch(a, item, mid+1, high); 
      }
      return binarySearch(a, item, low, mid-1); 
  } 
}

Пожалуйста, игнорируйте плохие соглашения об именах и тот факт, что это, возможно, еще не делает то, что должно делать.Сейчас я просто пытаюсь исправить этот сканер не работает.

1 Ответ

1 голос
/ 10 июня 2019

Я не совсем уверен, какова ваша конечная цель, но я смог решить вашу ошибку, выполнив следующее:

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
public class Rater
{
    static Scanner myObj = new Scanner(System.in);

    public static void main(String[] args)throws Exception
    {
        File file = new File("C:\\Users\\hparekh\\OneDrive - Visa Inc\\Documents\\test.txt");

        BufferedReader br = new BufferedReader(new FileReader(file));

        String st;
        ArrayList<String> movList = new ArrayList<String>();
        while ((st = br.readLine()) != null) {
            movList.add(st);
        }
        br.close();
        while(true) {
            System.out.println("Enter a movie to add.");
            String userName = myObj.nextLine();
            int index = binarySearch(movList, userName, 0, movList.size()-1);
            movList.add(index, userName);
        }
    }

    static int binarySearch(ArrayList<String> a, String item, int low, int high)
    {
        if (high <= low) {
            System.out.println("Did you like " + item + " more than " + a.get(low) + "?");
            String answer2 = myObj.nextLine().toLowerCase();
            if(answer2.equals("yes")) {
                return low + 1;
            }
            return low;
        }

        int mid = (low + high)/2;

        if(item == a.get(mid)) {
            return mid+1;
        }

        System.out.println("Did you like " + item + " more than " + a.get(mid) + "?");
        String answer2 = "";
        if(myObj.hasNextLine()){
            answer2 = myObj.nextLine().toLowerCase();
        }
        if(answer2.equals("yes")) {
            return binarySearch(a, item, mid+1, high);
        }
        return binarySearch(a, item, low, mid-1);
    }
}

Надеюсь, это поможет. Удачи.

...