Оценка должна быть положительной

Это ошибка, которую я продолжаю получать (которую я понимаю, но не могу исправить, потому что idk в ​​чем проблема)

[14:25:50 ERROR]: Could not pass event BlockBreakEvent to SurgeGlowstone v1.0
org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:297) ~[custom.jar:git-PaperSpigot-a925999]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[custom.jar:git-PaperSpigot-a925999]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:513) [custom.jar:git-PaperSpigot-a925999]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:498) [custom.jar:git-PaperSpigot-a925999]
        at net.minecraft.server.v1_7_R4.PlayerInteractManager.breakBlock(PlayerInteractManager.java:264) [custom.jar:git-PaperSpigot-a925999]
        at net.minecraft.server.v1_7_R4.PlayerInteractManager.dig(PlayerInteractManager.java:118) [custom.jar:git-PaperSpigot-a925999]
        at net.minecraft.server.v1_7_R4.PlayerConnection.a(PlayerConnection.java:569) [custom.jar:git-PaperSpigot-a925999]
        at net.minecraft.server.v1_7_R4.PacketPlayInBlockDig.a(PacketPlayInBlockDig.java:41) [custom.jar:git-PaperSpigot-a925999]
        at net.minecraft.server.v1_7_R4.PacketPlayInBlockDig.handle(PacketPlayInBlockDig.java:65) [custom.jar:git-PaperSpigot-a925999]
        at net.minecraft.server.v1_7_R4.NetworkManager.a(NetworkManager.java:189) [custom.jar:git-PaperSpigot-a925999]
        at net.minecraft.server.v1_7_R4.ServerConnection.c(ServerConnection.java:103) [custom.jar:git-PaperSpigot-a925999]
        at net.minecraft.server.v1_7_R4.MinecraftServer.v(MinecraftServer.java:801) [custom.jar:git-PaperSpigot-a925999]
        at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:286) [custom.jar:git-PaperSpigot-a925999]
        at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:651) [custom.jar:git-PaperSpigot-a925999]
        at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:557) [custom.jar:git-PaperSpigot-a925999]
        at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [custom.jar:git-PaperSpigot-a925999]
Caused by: java.lang.IllegalArgumentException: bound must be positive
        at java.util.Random.nextInt(Random.java:388) ~[?:1.8.0_131]
        at com.surgehcf.listeners.PlayerListener.onBreak(PlayerListener.java:49) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_131]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_131]

И вот мой код:

public static int randInt(int min, int max) {

    // NOTE: This will (intentionally) not run as written so that folks
    // copy-pasting have to think about how to initialize their
    // Random instance.  Initialization of the Random instance is outside
    // the main scope of the question, but some decent options are to have
    // a field that is initialized once and then re-used as needed or to
    // use ThreadLocalRandom (if using at least Java 1.7).
    Random rand = new Random();

    // nextInt is normally exclusive of the top value,
    // so add 1 to make it inclusive
    int randomNum = rand.nextInt((max - min) + 1) + min;

    return randomNum;
}
@EventHandler
public void onBreak(BlockBreakEvent e) {
    Player p = e.getPlayer();
    Block b = e.getBlock();
    JsonBox bx = GlowstoneMountain.getInstance().getRegionAqui(b.getLocation());
    if (bx != null && b.getType() == Material.GLOWSTONE && b.getWorld().getName().equalsIgnoreCase("world_nether")) {
        b.getWorld().dropItemNaturally(b.getLocation(), new ItemStack(Material.GLOWSTONE_DUST,randInt(4,2)));
    }
}

Я всегда делаю randomint между 4 и 2, но до сих пор он говорит минус в основном то, что я хочу, это int между 2 en 4, чтобы получить случайный вывод

2 ответа

Решение

Чтобы понять ошибку (и как ее исправить), проверьте документы Java на RandomnextInt():

Параметры:

граница - верхняя граница (эксклюзив). Должен быть позитивным.

Броски:

IllegalArgumentException - если привязка не является положительной

Тем не мение, randInt(4,2), как вы назвали свой метод, совершенно неверно. Оно использует 4 как min, 2 как max и вы, следовательно, в конечном итоге с отрицательной границей (-1), что приводит к исключению.

Поэтому я предлагаю следующее изменение вашего метода:

public static int randInt(int a, int b) {
    int min = Math.min(a, b);
    int max = Math.max(a, b);
    return rand.nextInt((max - min) + 1) + min;
}

Объяснение:

Прямо сейчас вы доверяете пользователю вашей функции соблюдать порядок аргументов (min, max - нет max, min). Хотя вы можете это сделать, вы только что поняли, как быстро это может привести к неприятностям, даже если пользователь - это вы.

Таким образом, добавление защиты, как описано выше, приведет к созданию более надежного кода. Здесь мы просто проверяем, какое из двух значений меньше, а какое больше, а затем используем их соответственно.

Конечно, вы также можете оставить свой метод как есть и просто изменить вызов на randInt(2,4),

Замечания:

Для пользователя все еще будет возможно заставить ваш метод сломаться (сгенерировать исключение, как указано выше), но я оставлю это в качестве упражнения для вас, чтобы выяснить, как и как вы можете защититься от него.:-)

В методе onBreak внутри оператора if измените это:

new ItemStack(Material.GLOWSTONE_DUST,randInt(4,2)));

к этому:

new ItemStack(Material.GLOWSTONE_DUST,randInt(2,4)));

Прямо сейчас вы пытаетесь получить случайный int с максимумом 2 и минимумом 4. Это невозможно. измените его на максимум 4 и минимум 2.

Порядок параметров для функции randInt: (min, max). В настоящее время вы рассматриваете это как (макс, мин)

Другие вопросы по тегам