Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.util.scanner throws NoSuchElementException when application is started with gradle run

I have a created a simple java "echo" application that takes a user's input and shows it back to them to demonstrate the issue. I can run this application without trouble using IntelliJ's internal "run" command, and also when executing the compiled java file produced by gradle build. However, if I try to execute the application using gradle run, I get a NoSuchElementException thrown from the scanner.

I think gradle or the application plugin specifically is doing something strange with the system IO.

Application

package org.gradle.example.simple;

import java.util.Scanner;

public class HelloWorld {
  public static void main(String args[]) {
    Scanner input = new Scanner(System.in);
    String response = input.nextLine();
    System.out.println(response);
  }
}

build.gradle

apply plugin: 'java'
version '1.0-SNAPSHOT'

apply plugin: 'java'

jar {
    manifest {
        attributes 'Main-Class': 'org.gradle.example.simple.HelloWorld'
    }
}

apply plugin: 'application'

mainClassName = "org.gradle.example.simple.HelloWorld"

sourceCompatibility = 1.5

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

Any ideas how to make this application work using gradle run?

like image 317
nickbdyer Avatar asked Apr 19 '16 15:04

nickbdyer


People also ask

How do I get rid of NoSuchElementException?

NoSuchElementException in Java can come while using Iterator or Enumeration or StringTokenizer. Best way to fix NoSuchElementException in java is to avoid it by checking Iterator with hashNext(), Enumeration with hashMoreElements() and StringTokenizer with hashMoreTokens().

What is NoSuchElementException in scanner?

The NoSuchElementException is thrown by Scanner class, Iterator interface, Enumerator interface, and StringTokenizer class. These classes have accessors' methods to fetch the next element from an iterable. They throw NoSuchElementException if the iterable is empty or has reached the maximum limit.


1 Answers

You must wire up default stdin to gradle, put this in build.gradle:

run {
    standardInput = System.in
}

UPDATE: 9 Sep 2021

As suggested by nickbdyer in the comments run gradlew run with --console plain option to avoid all those noisy and irritating prompts

Example

gradlew --console plain run

And if you also want to completely get rid of all gradle tasks logs add -q option

Example

gradlew -q --console plain run
like image 101
Humberto Pinheiro Avatar answered Sep 19 '22 11:09

Humberto Pinheiro