带有“ scanner.nextInt()”的线程“ main”中的异常java.util.NoSuchElementException

时间:2019-05-14 21:20:39

标签: java

执行以下代码进行双重转置加密和解密时遇到问题。

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]));
            }
        }
    }    
}

我从调用input的函数input()中收到错误,然后调用了scan.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)

这是怎么了?我怀疑这是Scanner.nextInt()或此处带有缓冲区的问题的原因,但是我真的不明白我在Internet上所读到的内容。

1 个答案:

答案 0 :(得分:-1)

如果没有更多令牌可用,则会抛出

NoSuchElementException

在将值分配给变量之前,应使用hasNextInt()

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