java.util.NoSuchElementException: строка не найдена

У меня возникла исключительная ситуация во время выполнения в моей программе, когда я читал файл через сканер.

java.util.NoSuchElementException: No line found     
   at java.util.Scanner.nextLine(Unknown Source)    
   at Day1.ReadFile.read(ReadFile.java:49)  
   at Day1.ParseTree.main(ParseTree.java:17) 

Мой код:

while((str=sc.nextLine())!=null){
    i=0;
    if(str.equals("Locations"))
    {
        size=4;
        t=3;
        str=sc.nextLine();
        str=sc.nextLine();
    }
    if(str.equals("Professions"))
    {
        size=3;
        t=2;
        str=sc.nextLine();
        str=sc.nextLine();
    }
    if(str.equals("Individuals"))
    {
        size=4;
        t=4;
        str=sc.nextLine();
        str=sc.nextLine();
    }

int j=0;
String loc[]=new String[size];
while(j<size){
    beg=0;
    end=str.indexOf(',');
    if(end!=-1){
        tmp=str.substring(beg, end);
        beg=end+2;
    }
    if(end==-1)
    {
        tmp=str.substring(beg);
    }
    if(beg<str.length())
        str=str.substring(beg);
    loc[i]=tmp;
    i++;

    if(i==size ){
        if(t==3)
        {
            location.add(loc);
        }
        if(t==2)
        {
            profession.add(loc);
        }
        if(t==4)
        {
            individual.add(loc);
        }
        i=0;
    }
    j++;
    System.out.print("\n");
}

person Ashish Panery    schedule 26.08.2011    source источник
comment
Добро пожаловать в SO. При размещении кода вы должны позаботиться о том, чтобы отформатировать его для удобочитаемости ... т.е. удалить ненужные пустые строки, сделать правильный отступ. Также отформатируйте трассировку стека как код, чтобы сделать ее удобочитаемой. Я исправил для вас форматирование.   -  person Jim Garrison    schedule 26.08.2011
comment
Кроме того, вы упустили самую важную часть - то, как sc был объявлен и открыт.   -  person Jim Garrison    schedule 26.08.2011


Ответы (6)


с Scanner вам нужно проверить, есть ли следующая строка с hasNextLine()

так что цикл становится

while(sc.hasNextLine()){
    str=sc.nextLine();
    //...
}

это читатели, которые возвращают null на EOF

конечно, в этом фрагменте кода это зависит от того, правильно ли отформатирован ввод

person ratchet freak    schedule 26.08.2011

Вы вызываете nextLine(), и он генерирует исключение, когда нет строки, точно так, как описывает javadoc. Он никогда не вернется null

http://download.oracle.com/javase/1,5.0/docs/api/java/util/Scanner.html

person Brian Roach    schedule 26.08.2011

Я тоже сталкиваюсь с этой проблемой. В моем случае проблема заключалась в том, что я закрыл сканер внутри одной из функций ..

public class Main 
{
	public static void main(String[] args) 
	{
		Scanner menu = new Scanner(System.in);
        boolean exit = new Boolean(false);
    while(!exit){
		String choose = menu.nextLine();
        Part1 t=new Part1()
        t.start();
	    System.out.println("Noooooo Come back!!!"+choose);
		}
	menu.close();
	}
}

public class Part1 extends Thread 
{
public void run()
  { 
     Scanner s = new Scanner(System.in);
     String st = s.nextLine();
     System.out.print("bllaaaaaaa\n"+st);
     s.close();
	}
}

		 

В приведенном выше коде было такое же исключение, решение заключалось в том, чтобы закрыть сканер только один раз на главном сервере.

person agr    schedule 06.12.2018
comment
Спасибо за этого приятеля, застрял на этой крошечной ошибке - person Aidan Ward; 04.11.2019
comment
У меня аналогичная проблема. Я хочу знать, почему это не сработает, если я закрою сканер и снова инициализирую его, когда прочитаю следующую строку. Оба они должны быть разными экземплярами сканера, верно? Почему закрытие одного экземпляра сканера повлияет на другой? - person Kaushik Evani; 13.11.2019

Ваша настоящая проблема в том, что вы вызываете sc.nextLine () БОЛЬШЕ ВРЕМЕНИ, чем количество строк.

Например, если у вас есть только ДЕСЯТЬ строк ввода, вы можете ТОЛЬКО вызвать sc.nextLine () ДЕСЯТЬ раз.

Каждый раз, когда вы вызываете sc.nextLine (), будет занята одна строка ввода. Если вы вызываете sc.nextLine () БОЛЬШЕ РАЗ, чем количество строк, вы получите исключение

      "java.util.NoSuchElementException: No line found".

Если вам нужно вызвать sc.nextLine () n раз, тогда у вас должно быть не менее n строк .

Попробуйте изменить свой код так, чтобы количество вызовов sc.nextLine () соответствовало количеству строк, и я гарантирую, что ваша проблема будет решена.

person William Hou    schedule 19.09.2017

По какой-то причине класс Scanner также выдает то же исключение, если он встречает специальные символы, которые он не может прочитать. Помимо использования метода hasNextLine() перед каждым вызовом nextLine(), убедитесь, что в конструктор Scanner передана правильная кодировка, например:

Scanner scanner = new Scanner(new FileInputStream(filePath), "UTF-8");

person Luís de Sousa    schedule 03.02.2016

Необходимо использовать верхний комментарий, но также обратите внимание на nextLine (). Чтобы устранить эту ошибку, позвоните только

sc.nextLine()

Один раз изнутри вашего цикла while

 while (sc.hasNextLine()) {sc.nextLine()...}

Вы используете while для просмотра вперед только 1 строки. Затем используйте sc.nextLine (), чтобы прочитать 2 строки перед единственной строкой, которую вы попросили цикл while смотреть вперед.

Также измените несколько операторов IF на IF, ELSE, чтобы также не читать более одной строки.

person Adam M. Erickson    schedule 11.09.2019