2012-09-05 99 views
2

我一直在編程Bukkit插件一段時間了,這一個問題讓我難堪。我試圖用掃描器從文件中讀取一行,然後將「:」前的所有內容添加到HashSet中。每次我嘗試,我得到一個NoSuchElementException,看起來像這樣:

掃描儀nextLine()NoSuchElementException

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

我已經告訴我打電話in.nextLine()兩次,當我問她關於如何解決它的建議,他只是不理我。任何幫助是極大的讚賞。

+1

我看到一個無限循環......如果你有另一行,它不是空的,你不會離開那個循環(因爲你沒有前進光標)。 – Makoto

回答

2

試試這個:

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); 
     } 
    } 
} 
+0

雖然我沒有使用這個確切的代碼,但是這個方法起作用了謝謝! – Theway2cool1

+1

@ Theway2cool1然後,不要忘了標記它是正確的(邊上的綠色複選標記)。 – Eric

+1

我很高興它爲你工作!@Eric感謝您尋找我:-) – alvonellos

0

in.nextLine()您正在調用兩次,但只檢查hasNextLine()一次。

在第二個調用中,您可能有可用的行。

players.add(in.nextLine() .split(「:」)[0]);

如何解決?

String tempLine = in.nextLine(); 

然後做這個字符串操作

+0

我加了String line = in.nextLine(); 然後在while循環中,我做了players.add(line.split(「:」)[0]; 現在它添加了同樣的東西兩次,換句話說,文件中有重複的條目 – Theway2cool1

+0

確定玩家是HashSet ?設置不應該接受重複 – kosa

+0

我的錯誤我應該把整個類放到原始文章中,它應該在「:」之前將文本添加到HashSet,然後檢查以確保玩家的用戶名不在HashSet添加到文件前原始編輯後顯示整個類 – Theway2cool1