java - NoSuchMethodException when instantiating a class using newInstance() -
i'm using following code instantiate every class in package:
(class listenerclass : classgetter.getclassesforpackage(this, "cullan.listener")) { bukkit.getlogger().info(listenerclass.getsimplename()); if (!listenerclass.getsimplename().equals("enchantmentlistener")) { try { listenerclass.newinstance(); } catch (exception ex) { ex.printstacktrace(); } } } this works fine, however, i'm getting error when 1 of classes being instantiated:
[07:07:58] [server thread/warn]: java.lang.instantiationexception: cullan.listener.agilitylistener$1 [07:07:58] [server thread/warn]: @ java.lang.class.newinstance(unknown source) [07:07:58] [server thread/warn]: @ cullan.main.dcenchants.loadenchants(dcenchants.java:62) [07:07:58] [server thread/warn]: @ cullan.main.dcenchants.onenable(dcenchants.java:24) [07:07:58] [server thread/warn]: @ org.bukkit.plugin.java.javaplugin.setenabled(javaplugin.java:321) [07:07:58] [server thread/warn]: @ org.bukkit.plugin.java.javapluginloader.enableplugin(javapluginloader.java:340) [07:07:58] [server thread/warn]: @ org.bukkit.plugin.simplepluginmanager.enableplugin(simplepluginmanager.java:405) [07:07:58] [server thread/warn]: @ net.skycraftmc.pluginmanager.pluginmanagerplugin.oncommand(pluginmanagerplugin.java:287) [07:07:58] [server thread/warn]: @ org.bukkit.command.plugincommand.execute(plugincommand.java:44) [07:07:58] [server thread/warn]: @ org.bukkit.command.simplecommandmap.dispatch(simplecommandmap.java:141) [07:07:58] [server thread/warn]: @ org.bukkit.craftbukkit.v1_8_r3.craftserver.dispatchcommand(craftserver.java:646) [07:07:58] [server thread/warn]: @ org.bukkit.craftbukkit.v1_8_r3.craftserver.dispatchservercommand(craftserver.java:632) [07:07:58] [server thread/warn]: @ net.minecraft.server.v1_8_r3.dedicatedserver.ao(dedicatedserver.java:409) [07:07:58] [server thread/warn]: @ net.minecraft.server.v1_8_r3.dedicatedserver.b(dedicatedserver.java:373) [07:07:58] [server thread/warn]: @ net.minecraft.server.v1_8_r3.minecraftserver.a(minecraftserver.java:709) [07:07:58] [server thread/warn]: @ net.minecraft.server.v1_8_r3.minecraftserver.run(minecraftserver.java:612) [07:07:58] [server thread/warn]: @ java.lang.thread.run(unknown source) [07:07:58] [server thread/warn]: caused by: java.lang.nosuchmethodexception: cullan.listener.agilitylistener$1.<init>() [07:07:58] [server thread/warn]: @ java.lang.class.getconstructor0(unknown source) this class throwing error:
package cullan.listener; import cullan.type.enchantmentrarity; import org.bukkit.enchantments.enchantment; import org.bukkit.entity.player; import org.bukkit.event.eventhandler; import org.bukkit.event.player.playerquitevent; import org.bukkit.inventory.itemstack; import org.bukkit.potion.potioneffect; import java.util.arraylist; import java.util.list; public class agilitylistener extends enchantmentlistener{ private list<player> players = new arraylist<>(); public agilitylistener() { super(enchantment.getbyname("agility"), enchantmentrarity.very_rare); starttimer(); } @eventhandler public void onquit(playerquitevent event) { player player = event.getplayer(); if (players.contains(player)) { players.remove(player); } } private void starttimer() { final potioneffect effect = mainconfig.getagilityeffect(); instance.getserver().getscheduler().schedulesyncrepeatingtask(instance, new runnable() { @override public void run() { (player player : instance.getserver().getonlineplayers()) { itemstack boots = player.getinventory().getboots(); if (boots != null && boots.containsenchantment(enchantment)) { player.addpotioneffect(effect); players.add(player); } else if (players.contains(player)) { player.removepotioneffect(effect.gettype()); players.remove(player); } } } }, 10l, 10l); } } the error not occur if remove starttimer() method. why happen?
the problem you're not trying construct instance of agilitylistener - you're trying construct instance of anonymous inner class created in agilitylistener.starttimer. that's why stack trace has:
caused by: java.lang.nosuchmethodexception: cullan.listener.agilitylistener$1.<init>() the "$1" shows it's anonymous inner class.
if want filter out nested/inner classes, expand check on class name:
if (!listenerclass.getsimplename().equals("enchantmentlistener") && !listenerclass.getsimplename().contains("$")) or:
!listenerclass.isanonymousclass() etc. check whether class has public parameterless constructor, , it's assignable enchantmentlistener.
Comments
Post a Comment