我在java中创建一个简单的UDP客户端和服务器。但是,当我尝试让用户输入第二个选项时,我不断收到java.util.NoSuchElementException。
第一选择很有效。用户输入号码,数据包被发送到服务器,然后返回到客户端。然而,当循环返回以提示用户进行另一个选择时,那就是错误发生时。
我尝试过多种不同的事情,例如在while循环中添加扫描器实例化,尝试通过在while循环结束时添加keyScan.nextLine()来清除扫描缓冲区,将nextInt更改为nextLine并且将该行解析为整数,都无济于事。我认为这可能是因为我不了解扫描仪如何在涉及网络时工作,因为这是我第一次涉足Java网络。这是主要方法:
public static void main(String[] args) throws IOException
{
//local constants
final int CAP = 1;
final int DATE = 2;
final int FILE = 3;
final int EXIT = 4;
//local variables
int choice;
String sentence;
boolean inputFlag = false;
InetAddress IP;
/**************************** BEGIN main *****************************/
if(args.length == 1)
{
//convert arguments to bytes
IP = getIP(args[0]);
//IF it is a valid IP address
if(IP != null)
{
//prompt user to make a choice
while(inputFlag == false)
{
Scanner keyScan = new Scanner(System.in);
//print the menu
System.out.print(menu());
try{
choice = keyScan.nextInt();
//capitalize
if(choice == CAP)
{
//get sentence from user and capitalize it
sentence = cap(IP);
System.out.println(sentence);
}
else
//set loop flag to true
inputFlag = true;
}catch(InputMismatchException ime) {
//prompt user to enter correct input
System.out.println("This was not a valid input, use numbers"
+ " only!\n");
keyScan.next();
}
keyScan.nextLine();
}//END WHILE
}
else
System.out.println();
}
else
System.out.println("Usage: java UDPClient [IP address]");
}//END main
我还没有实现日期或文件选择,只是在解决这些问题之前试图让齿轮顺利工作。这是堆栈跟踪。
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:907)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextInt(Scanner.java:2160)
at java.util.Scanner.nextInt(Scanner.java:2119)
at UDPClient.main(UDPClient.java:164)
答案 0 :(得分:0)
在没有堆栈跟踪的情况下工作,可能就像在while循环中在System.in中分配新的Scanner一样简单。因此,System.in可能连接了多个扫描仪(没有GC),这可能是非法的?
或者,< CR>在可以读取下一个数字之前,可能必须从扫描仪清除输入。
答案 1 :(得分:0)
如果输入中没有更多令牌可用,则会抛出NoSuchElementException
。