Java Scanner nextLine()NoTouchElementException
我已经编写了一个Bukkit插件有一段时间了,这个问题让我很困惑。我试图使用扫描仪从文件中读取一行,并将“:”之前的所有内容添加到哈希集。每次尝试时,我都会得到一个NoTouchElementException,如下所示:Java Scanner nextLine()NoTouchElementException,java,minecraft,bukkit,Java,Minecraft,Bukkit,我已经编写了一个Bukkit插件有一段时间了,这个问题让我很困惑。我试图使用扫描仪从文件中读取一行,并将“:”之前的所有内容添加到哈希集。每次尝试时,我都会得到一个NoTouchElementException,如下所示: 21:01:01 [SEVERE] Could not pass event PlayerLoginEvent to ServerProtect org.bukkit.event.EventException at org.bukkit.plugin.java
21:01:01 [SEVERE] Could not pass event PlayerLoginEvent to ServerProtect
org.bukkit.event.EventException
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
va:341)
at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
a:62)
at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.j
ava:477)
at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
ava:462)
at net.minecraft.server.ServerConfigurationManagerAbstract.attemptLogin(
ServerConfigurationManagerAbstract.java:273)
at net.minecraft.server.NetLoginHandler.d(NetLoginHandler.java:112)
at net.minecraft.server.NetLoginHandler.c(NetLoginHandler.java:41)
at net.minecraft.server.DedicatedServerConnectionThread.a(DedicatedServe
rConnectionThread.java:44)
at net.minecraft.server.DedicatedServerConnection.b(SourceFile:29)
at net.minecraft.server.MinecraftServer.q(MinecraftServer.java:578)
at net.minecraft.server.DedicatedServer.q(DedicatedServer.java:213)
at net.minecraft.server.MinecraftServer.p(MinecraftServer.java:474)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:406)
at net.minecraft.server.ThreadServerApplication.run(SourceFile:539)
Caused by: java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at com.gmail.thecotlsdragon98.ServerProtect.AltAccounts.CheckForUsedIP(A
ltAccounts.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.ja
va:339)
... 13 more
这是我试图做我上面解释的事情的课程
package com.gmail.thecotlsdragon98.ServerProtect;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Scanner;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerLoginEvent.Result;
import org.bukkit.event.server.PluginDisableEvent;
import org.bukkit.event.server.PluginEnableEvent;
public class AltAccounts implements Listener
{
ServerProtect plugin;
public AltAccounts(ServerProtect instance){
plugin = instance;
}
File usersFile;
FileWriter outputFile;
PrintWriter out;
Scanner in;
HashSet<String> players = new HashSet<String>();
StringBuffer buffer = new StringBuffer();
@EventHandler
public void newUsersFile(PluginEnableEvent event) throws IOException{
if(event.getPlugin() == plugin){
usersFile = new File("plugins\\ServerProtect\\users.yml");
if(!usersFile.exists()){
usersFile.createNewFile();
}
}
}
@EventHandler
public void CheckForUsedIP(PlayerLoginEvent event) throws IOException{
outputFile = new FileWriter(usersFile, true);
out = new PrintWriter(outputFile);
in = new Scanner(new FileReader(usersFile));
String[] nameandIP;
String name;
String IP;
String line = in.nextLine();
while(in.hasNextLine() && !in.nextLine().isEmpty()){
players.add(line.split(": ")[0]);
if(!players.contains(event.getPlayer().getName())){
out.println(event.getPlayer().getName() + ": " + event.getAddress().getHostAddress());
out.close();
}
}
if(!in.hasNextLine() || in.nextLine().isEmpty()){
if(!players.contains(event.getPlayer().getName())){
out.println(event.getPlayer().getName() + ": " + event.getAddress().getHostAddress());
out.close();
players.clear();
}
}
if(!plugin.getConfig().getBoolean("alts.kick-on-login")){
while(in.hasNextLine()){
nameandIP = in.nextLine().split(": ");
name = nameandIP[0];
IP = nameandIP[1];
if(event.getAddress().getHostAddress().equals(IP) && !event.getPlayer().getName().equals(name)){
for(final Player player : plugin.getServer().getOnlinePlayers()){
if(player.hasPermission("serverprotect.alts.notify")){
player.sendMessage(ChatColor.RED + event.getPlayer().getName() + " has the same IP as " + name + " (" + event.getAddress().getHostAddress() + ")");
}
}
}
}
}
else if(plugin.getConfig().getBoolean("alts.kick-on-login")){
while(in.hasNextLine()){
nameandIP = in.nextLine().split(": ");
name = nameandIP[0];
IP = nameandIP[1];
if(event.getAddress().getHostAddress().equalsIgnoreCase(IP)){
event.setKickMessage("The IP address you've logged in with is used. Alternate account?");
event.setResult(Result.KICK_OTHER);
}
}
}
}
public void Disable(PluginDisableEvent event)throws IOException{
if(event.getPlugin() == plugin){
in.close();
}
}
}
package com.gmail.thecotlsdragon98.ServerProtect;
导入java.io.File;
导入java.io.FileReader;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.io.PrintWriter;
导入java.util.HashSet;
导入java.util.Scanner;
导入org.bukkit.ChatColor;
导入org.bukkit.entity.Player;
导入org.bukkit.event.EventHandler;
导入org.bukkit.event.Listener;
导入org.bukkit.event.player.PlayerLoginEvent;
导入org.bukkit.event.player.PlayerLoginEvent.Result;
导入org.bukkit.event.server.pluginableevent;
导入org.bukkit.event.server.PluginEnableEvent;
公共类AltAccounts实现侦听器
{
服务器保护插件;
公共AltaAccounts(服务器保护实例){
plugin=实例;
}
文件用户文件;
FileWriter输出文件;
打印输出;
扫描仪输入;
HashSet players=新HashSet();
StringBuffer=新的StringBuffer();
@事件处理程序
public void newUsersFile(PluginEnableEvent事件)引发IOException{
if(event.getPlugin()==插件){
usersFile=新文件(“plugins\\ServerProtect\\users.yml”);
如果(!usersFile.exists()){
usersFile.createNewFile();
}
}
}
@事件处理程序
public void CheckForUsedIP(PlayerLoginEvent事件)引发IOException{
outputFile=newfilewriter(usersFile,true);
out=新的PrintWriter(输出文件);
in=新扫描仪(新文件阅读器(用户文件));
字符串[]nameandIP;
字符串名;
字符串IP;
String line=in.nextLine();
while(in.hasNextLine()&&!in.nextLine().isEmpty()){
players.add(line.split(“:”[0]);
如果(!players.contains(event.getPlayer().getName())){
out.println(event.getPlayer().getName()+“:”+event.getAddress().getHostAddress());
out.close();
}
}
如果(!in.hasNextLine()| | in.nextLine().isEmpty()){
如果(!players.contains(event.getPlayer().getName())){
out.println(event.getPlayer().getName()+“:”+event.getAddress().getHostAddress());
out.close();
玩家。清除();
}
}
如果(!plugin.getConfig().getBoolean(“登录时alts.kick”)){
while(在.hasNextLine()中){
nameandIP=in.nextLine().split(“:”);
name=nameandIP[0];
IP=名称和IP[1];
如果(event.getAddress().getHostAddress().equals(IP)和&!event.getPlayer().getName().equals(name)){
对于(最终玩家:plugin.getServer().getOnlinePlayer()){
if(player.hasPermission(“serverprotect.alts.notify”)){
player.sendMessage(ChatColor.RED+event.getPlayer().getName()+”与“+name+”(“+event.getAddress().getHostAddress()+”)具有相同的IP地址);
}
}
}
}
}
else if(plugin.getConfig().getBoolean(“登录时alts.kick”)){
while(在.hasNextLine()中){
nameandIP=in.nextLine().split(“:”);
name=nameandIP[0];
IP=名称和IP[1];
if(event.getAddress().getHostAddress().equalsIgnoreCase(IP)){
setKickMessage(“使用了您登录的IP地址。备用帐户?”);
event.setResult(Result.KICK_OTHER);
}
}
}
}
公共无效禁用(PlugindableEvent事件)引发IOException{
if(event.getPlugin()==插件){
in.close();
}
}
}
有人告诉我两次打电话给.nextLine(),当我询问如何修复它时,他根本不理我。非常感谢您的帮助。在.nextLine()
中,您调用了两次此命令,但只检查了一次
在第二次通话中,您可能有可用的线路
players.add(in.nextLine()
.split(“:”[0])
如何修复?
String tempLine = in.nextLine();
然后在此字符串上执行操作尝试以下操作:
import java.io.*;
import java.lang.*;
import java.util.*;
public class test {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNextLine()) {
String line = in.nextLine();
String parse = line.substring(0, line.lastIndexOf(':'));
System.out.println(parse);
}
}
}
我在.nextLine()中添加了字符串line=in;然后在while循环中,我添加了players.add(line.split(“:”)[0];现在它添加了两次相同的内容。换句话说,文件中有重复的条目。糟糕的是,我应该将整个类放到原始帖子中。它应该在“:”之前添加文本。”到哈希集,然后在将其添加到文件之前检查以确保播放机的用户名不在哈希集中。原始帖子编辑显示了整个类。我找不到任何向哈希集添加结果的snipper。我看到一个无限循环…如果你有另一行,并且它不是空的,你就不会离开该循环(因为你没有推进光标).虽然我没有使用这个精确的代码,但这个方法还是有效的。谢谢你!@Theway2cool1别忘了把它标记为正确的,那么。(旁边的绿色小复选标记。)我很高兴它对你有效!@Eric谢谢你照顾我:-)