1

EDIT: While this issue has been marked as a duplicate, the other issue is different to my situation; it seems as though the program is ignoring this line:

decision = scan.nextInt();

I'm having some trouble with my scanner. I have a program that runs off a simple menu system. The program works, but whenever it goes back to repeating the program again (I made the program have the ability to repeat by putting it in a while loop) it throws this error:

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:919)
    at java.util.Scanner.next(Scanner.java:1542)
    at java.util.Scanner.nextInt(Scanner.java:2172)
    at java.util.Scanner.nextInt(Scanner.java:2131)
    at GuardSearch.Menu(GuardSearch.java:29)
    at GuardSearch.main(GuardSearch.java:8)

The program all works on the first run through the menu and its actions, but then when the call of the if statement is completed and the program returns to the while loop, it throws this exception. What am I missing?

I can post all the classes of the program if needed, however I believe my problem is within the following class:

import java.util.Scanner;
import java.lang.*;

public class GuardSearch {

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

    public static void Menu(){
            Scanner scan = new Scanner(System.in);
            boolean leave = false;
            while(leave!=true){
                    final String ANSI_CLS = "\u001b[2J";
                    final String ANSI_HOME = "\u001b[H";
                    System.out.print(ANSI_CLS + ANSI_HOME);
                    System.out.flush();
                    int decision = 0;
                    System.out.println("Welcome to GuardSearch, our little slice of Google.\n");
                    while ((decision != 1) || (decision != 2)){
                            System.out.println("Please enter the number of what you would like to do from the following list:");
                            System.out.println("1. Submit knowledge.");
                            System.out.println("2. Search.");
                            System.out.println("3. Quit.");
                            decision = scan.nextInt();
                            if (decision == 1) {
                                    Submit submit = new Submit();
                                    submit.takeinfo();
                                    break;
                            }
                            else if (decision == 2){
                                    Search search = new Search();
                                    search.takekeywords();
                                    break;
                            }
                            else if (decision == 3){
                                    leave = true;
                                    break;
                            }
                    }
            }
            scan.close();
    }
 }

Thanks in advance. I have researched this issue and found no occurrences relevant to my exact issue.

EDIT: Here is my Submit and Search class as requested:

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

public class Submit {

    public static void takeinfo() {
            final String ANSI_CLS = "\u001b[2J";
            final String ANSI_HOME = "\u001b[H";
            System.out.print(ANSI_CLS + ANSI_HOME);
            System.out.flush();

            System.out.println("Submit your knowledge to the system.\n");

            Scanner sc = new Scanner(System.in);
            int decision = 0;
            while ((decision != 1) || (decision != 2)){
                    System.out.println("1. Change an existing article.");
                    System.out.println("2. Create a new article.");
                    System.out.println("3. Delete an article.");
                    System.out.println("4. Back.");
                    decision = sc.nextInt();
                    if (decision == 1) {
                            ChangeArticle chngArt = new ChangeArticle();
                            chngArt.takeinfo();
                            break;
                    }
                    else if (decision == 2){
                            CreateArticle createArt = new CreateArticle();
                            createArt.title();
                            break;
                    }
                    else if (decision == 3){
                            DeleteArticle deleteArt = new DeleteArticle();
                            deleteArt.takeinfo();
                            break;
                    }

                    else if (decision == 4){
                            GuardSearch gs = new GuardSearch();
                            gs.Menu();
                            break;
                    }
                    else {
                            System.out.println("Please enter a valid number.\n");
                    }
            }
    sc.close();
    }
}

And the Search class:

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

public class Search {

    Scanner sc = new Scanner(System.in);


    public void takekeywords() {
            final String ANSI_CLS = "\u001b[2J";
            final String ANSI_HOME = "\u001b[H";
            System.out.print(ANSI_CLS + ANSI_HOME);
            System.out.flush();

            System.out.println("Search the system.\n");

            boolean fin  = false;
            int dec;
            while (fin != true){
                    System.out.println("Please select which search type you want:\n");
                    System.out.println("1. Keywords.");
                    System.out.println("2. Category listing.");
                    System.out.println("3. Back\n");
                    dec = sc.nextInt();
                    if (dec == 1) {
                            // Do a keyword thing
                            fin = true;
                    }
                    else if (dec == 2) {
                            // Do a category thing
                            searchCategories();
                            fin = true;
                    }
                    else if (dec == 3) {
                            GuardSearch gs = new GuardSearch();
                            gs.Menu();
                            break;
                    }
            }
    }


    public void searchCategories(){
            // Create an empty list of subcategories, that will be added to when the user wants to add sub categories
            LinkedList<Category> newSubCategories = new LinkedList<Category>();
            // Create a list of .txt's relevant to the category
            LinkedList<String> relevantArticles = new LinkedList<String>();
            relevantArticles.add("example.txt");
            LinkedList<String> dirListing = new LinkedList<String>();

            //System.out.println("Please select your category:\n");
            String s = "Example Category";


            // Create the first category, passing in its name, an empty list of subCategories (which are of type Category), and a list of .txt's relevant to the category
            Category firstCategory = new Category(s, newSubCategories, relevantArticles);

            File wd = new File("/bin");
            Process proc = null;
            try {
                    proc = Runtime.getRuntime().exec("/bin/bash", null, wd);
            }
 catch (IOException e) {
                    e.printStackTrace();
            }
            if (proc != null) {
                    BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
                    out.println("cd /var/tmp/cholland/GuardSearch/");
                    out.println("ls *.art");
                    out.println("exit");
                    String line;
                    System.out.println();
                    try {
                            int x = 1;
                            while ((line = in.readLine()) != null) {
                                    System.out.println(x + ") " + line);
                                    dirListing.add(line);
                                    x++;
                            }

                            System.out.println("Please select the article you want:\n");
                            int dec = sc.nextInt();
                            //System.out.println(Arrays.toString(dirListing.toArray()));
                            System.out.println(dirListing.size());
                            try {
                                    for (int y=1; y<=dirListing.size(); y++) {
                                            if (y == dec){
                                                    boolean fin = false;
                                                    while (fin != true){
                                                            System.out.println("You chose: " + (dirListing.get(boundIndex(y))) + ". Opening file...");
                                                            System.out.println("===========================================================\n");
                                                            String text;
                                                            String filepath = ("/var/tmp/cholland/GuardSearch/" + (dirListing.get(boundIndex(y))));
                                                            BufferedReader br = null;
                                                            StringBuffer contents = new StringBuffer();
                                                            try {
                                                                    br = new BufferedReader(new FileReader(filepath));
                                                                    text = null;
                                                                    while ((text = br.readLine()) != null) {
                                                                            contents.append(text).append(System.getProperty("line.separator"));
                                                                    }
                                                            } catch (IOException e) {
                                                                    e.printStackTrace();
                                                            } finally {
                                                                    try {
                                                                            if (br != null)br.close();
                                                                    } catch (IOException ex) {
                                                                            ex.printStackTrace();
                                                                    }
                                                            }
                                                            text = (contents.toString());
                                                            System.out.println(text);
                                                            System.out.println("\n===========================================================\n");
                                                            fin = true;
                                                    }
                                            }
                                    }
                            }
                            catch (Exception e) {
                                    e.printStackTrace();
                            }

                    proc.waitFor();
                    out.close();
                    in.close();
                    proc.destroy();
                    }
                    catch (Exception e) {
                            e.printStackTrace();
                    }

            }
            sc.close();

    }

    public int boundIndex(int x){
            if (x != 0){
                    return (x - 1);
            }
            else {
                    return 0;
            }
    }


}
sparkhead95
  • 395
  • 4
  • 14

2 Answers2

0

I think the problem is here decision = scan.nextInt();

NoSuchElementException will be thrown if no more tokens are available. This is caused by invoking nextInt() without checking if there's any integer available. You can hasNextInt() to check if any more tokens are available.

Something like:

if(scan.hasNextInt() )
    decision = scan.nextInt(); // if there is another number  
else 
    decision = 0; // nothing added in the input 
Jkike
  • 807
  • 6
  • 12
  • Presumably this is a text-based menu and the user inputs the token. Not sure if this will fix the issue. However, as the question is unclear, I follow your logic. – D. Ben Knoble Sep 10 '15 at 14:13
  • Thanks, however @BenKnoble is right - the user inputs the token. hasNextInt() shouldn't need to be thrown as the user should be prompted for it. – sparkhead95 Sep 10 '15 at 14:17
0

The cause of the error is that you are closing the scanner at the end of searchCategories.

Little Santi
  • 8,563
  • 2
  • 18
  • 46