Phạm Nhật Minh
Phạm Nhật Minh

Reputation: 101

Exception in thread "main" java.util.NoSuchElementException with scanner.nextInt()

I've got the problem executing the following code for double transposition encryption and decryption.

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

public class HelloWorld
{
  public static void main(String[] args)
  {
        NewEncryptAndDecrypt ned=new NewEncryptAndDecrypt();
        ned.input();
  }
}

class NewEncryptAndDecrypt
{
    Scanner sc=new Scanner(System.in);
    void input()
    {
        int ch;
        do
        {
            System.out.println("\n\t\t*****ENTER*****");
            System.out.println("\t1.Encrypt");
            System.out.println("\t2.Decrypt");
            System.out.println("\t0.Exit");
            ch=sc.nextInt();
            switch(ch)    
            {
                case 1:
                {
                    encrypt();
                    break;
                }
                case 2:
                {
                    decrypt();
                    break;
                }
            }
        }while(ch!=0);
    }
    void encrypt()
    {


        //String ip,t;
        char text[][],enc[][];
        int key,i,j,row[],col[],r,c;
        int k=0,m,n;
        System.out.print("Enter The Plain Text ");
        StringBuilder ip = new StringBuilder(sc.next());
        StringBuilder t = new StringBuilder(sc.nextLine());
//        ip=sc.next();
//        t=sc.nextLine();
        System.out.print("Enter The Number Of Rows ");
        r=sc.nextInt();
        System.out.print("Enter The Number Of Columns ");
        c=sc.nextInt();
        text=new char[r][c];
        enc=new char[r][c];
        row=new int[r];
        col=new int[c];
        for(i=0;i<r;i++)
        {
            for(j=0;j<c;j++)
            {
                text[i][j]=ip.charAt(k);
                k++;
            }
        }
        System.out.println("Enter The Row Key ");
        for(i=0;i<r;i++)
            row[i]=(sc.nextInt()-1);
        System.out.println("Enter The Column Key ");
        for(i=0;i<c;i++)
            col[i]=(sc.nextInt()-1);
        k=0;
        System.out.print("The Cipher Text Is ");
        for(i=0;i<r;i++)
        {
            m=row[i];
            for(j=0;j<c;j++)
            {
                n=col[j];
                enc[i][j]=text[m][n];
                System.out.print(""+Character.toUpperCase(enc[i][j]));
            }
        }
    }
    void decrypt()
    {
        String ip,t;
        char text[][],enc[][];
        int key,i,j,row[],col[],r,c;
        int k=0,m,n;
        System.out.print("Enter The Cipher Text ");
        ip=sc.next();
        t=sc.nextLine();
        System.out.print("Enter The Number Of Rows ");
        r=sc.nextInt();
        System.out.print("Enter The Number Of Columns ");
        c=sc.nextInt();
        text=new char[r][c];
        enc=new char[r][c];
        row=new int[r];
        col=new int[c];
        for(i=0;i<r;i++)
        {
            for(j=0;j<c;j++)
            {
                text[i][j]=ip.charAt(k);
                k++;
            }
        }
        System.out.println("Enter The Row Key ");
        for(i=0;i<r;i++)
            row[i]=(sc.nextInt()-1);
        System.out.println("Enter The Column Key ");
        for(i=0;i<c;i++)
            col[i]=(sc.nextInt()-1);
        k=0;
        for(i=0;i<r;i++)
        {
            m=row[i];
            for(j=0;j<c;j++)
            {
                n=col[j];
                enc[m][n]=text[i][j];
            }
        }
        System.out.print("The Retrieved Plain Text Is ");
        for(i=0;i<r;i++)
        {
            for(j=0;j<c;j++)
            {
                System.out.print(""+Character.toLowerCase(enc[i][j]));
            }
        }
    }    
}

I receive the error from the function input() where I call scanner.nextInt()

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at NewEncryptAndDecrypt.input(HelloWorld.java:33)
    at HelloWorld.main(HelloWorld.java:17)

What is wrong here? I'm doubt that's the problem with the scanner.nextInt() or something with the buffer here but I really don't understand from what I was reading on the Internet.

Upvotes: 0

Views: 1198

Answers (1)

itpr
itpr

Reputation: 404

NoSuchElementException will be thrown if no more tokens are available.

You should use hasNextInt() before assigning value to variable.

if(sc.hasNextInt()){
   ch=sc.nextInt();
}

Upvotes: 1

Related Questions