【问题标题】:Minecraft plugin hanging on "Enabling plugin" and producing out of memory errorsMinecraft 插件挂在“启用插件”上并产生内存不足错误
【发布时间】:2021-09-02 21:51:37
【问题描述】:

为什么这段代码会出现内存问题?它运行良好一次,然后当我尝试再次运行它时,它会挂在“启用插件”上。然后它会给我一个 OutOfMemoryException 例如

“异常:线程“Worker-Main-10”中的 UncaughtExceptionHandler 抛出 java.lang.OutOfMemoryError”

我使用的代码如下来自 Spigot API

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Bat;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitScheduler;

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.UUID;

public class COVID19 extends JavaPlugin {
    private static ArrayList<CovidInfection> infections;

    @Override
    public void onEnable() {
        infections = new ArrayList<CovidInfection>();
        System.out.println("1");
        try {
            readInfections();
        } catch (FileNotFoundException fnfe) {
            fnfe.printStackTrace();
        }
        System.out.println("2");
        this.getCommand("getInfected").setExecutor(new CommandGetInfected());
        BukkitScheduler scheduler = getServer().getScheduler();
        scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
            @Override
            public void run() {
                batCovid();
            }
        }, 0, 10);
        System.out.println(4);
    }

    @Override
    public void onDisable() {
        try {
            writeInfections();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    public void batCovid() {
        System.out.println(3);
        for(Player player : Bukkit.getOnlinePlayers()) {
            for(Entity nearby : player.getNearbyEntities(6, 6, 6)) {
                if (nearby instanceof Bat) {
                    String name = player.getName();
                    UUID uuid = player.getUniqueId();
                    infections.add(new CovidInfection(uuid, name, 14));
                }
            }
        }
    }

    public void readInfections() throws FileNotFoundException {
        File file = new File("infected.txt");
        if(file.length() == 0) {
            return;
        }
        Scanner input = new Scanner(file);
        String line = input.nextLine();
        while (!(line.equals(""))) {
            infections.add(parseInfectionLine(line));
        }
        input.close();
    }

    public void writeInfections() throws IOException {
        //File will be written as UUID,Name,DaysRemaining
        FileWriter writer = new FileWriter("infected.txt", false);
        for(CovidInfection infection : infections) {
            writer.write(infection.toString());
        }
        writer.close();
    }

    private CovidInfection parseInfectionLine(String line) {
        String[] words = line.replace("\n","").split(",");
        return  new CovidInfection(UUID.fromString(words[0]), words[1], Integer.parseInt(words[2]));
    }

    public static String getInfected() {
        String compiled = "";
        for (CovidInfection infection : infections) {
            compiled += infection.toString() + "\n";
        }
        return compiled;
    }
}
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

public class CommandGetInfected implements CommandExecutor {
    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        String message = COVID19.getInfected();
        if(!(message.equals(""))) {
            sender.sendMessage(message);
        } else {
            sender.sendMessage("There are no infected!");
        }
        return(true);
    }
}
import java.util.UUID;

public class CovidInfection {
    private UUID uuid;
    private String name;
    private int days;

    public CovidInfection(UUID uuid, String  name, int days) {
        this.uuid = uuid;
        this.name = name;
        this.days = days;
    }

    public int getDays() {
        return days;
    }

    public String getName() {
        return name;
    }

    public UUID getUuid() {
        return uuid;
    }

    public void newDay() {
        days--;
    }

    public String toString() {
        return uuid.toString() + "," + name + "," + days + "\n";
    }
}

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: java minecraft


    【解决方案1】:

    首先,您在主线程上发出 I/O 请求。

    要解决此问题,请使用多线程,例如解释 herehere

    那么,这个:

    Scanner input = new Scanner(file);
    String line = input.nextLine();
    

    不能在服务器中使用。

    这样的输入已经存在,它是控制台发送者。

    为此,我建议您使用ServerCommandEvent 并使用spigot 的控制台。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-31
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多