Java: Non-static method cannot be referenced from static context

Permalänk
Medlem

Java: Non-static method cannot be referenced from static context

Hej jag är väldigt ny på Java och programmering generellt, men det jag försöker göra är ett bukkit plugin som gör så att du exploderar när ett verktyg går sönder. Men jag har stött på ett problem, jag har ingen aning om hur jag använder createExplosion metoden. Jag får bara Non-static method cannot be referenced from static context när jag försöker kalla på den. Min kod ser ut såhär:

/** * Created by Administrator on 2017-03-21. */ import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerItemBreakEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.World; public class bigbrother implements org.bukkit.event.Listener { public String Name = "[Autonomous Fireworks]"; // Join message @EventHandler public void onPlayerJoinEvent (PlayerJoinEvent event) { event.setJoinMessage("Welcome " + event.getPlayer().getDisplayName() + " to the server" ); } // End of Join message @EventHandler public void onPlayerItemBreakEvent (PlayerItemBreakEvent event) { // Create Doubles to store player location Double X; Double Y; Double Z; // Get X,Y,Z and assign to correct Double X = event.getPlayer().getLocation().getX(); Y = event.getPlayer().getLocation().getY(); Z = event.getPlayer().getLocation().getZ(); // Explosion power float power = 4F; // What is static context? How do I use createExplosion? World.createExplosion(X, Y, Z, power); // TEMPORARY if () { System.out.println(Name + "Success"); } else { System.out.println(Name + "FAIL"); } // END OF TEMPORARY } }

Hur åkallar jag den på rätt sätt? och om ni har några andra tips på förbättringar så är dom mer än välkommna.

MvH Gymi

Visa signatur

Arbetstation/spel dator: CPU: Intel Xeon E5 2670 Mobo: Z9PA-U8 GPU: GTX 980 Reference Chassi: Phanteks Enthoo Evolv ATX SSD: OCZ Trion 150 480GB RAM: 64 GB Nanya 1333mhz LRDIMM OS: Fedora 28
Server: HP proliant dl160 G6 CPU: 2x l5630 RAM: 36GB

Permalänk
Medlem

Du måste använda rätt instans utav World, inte den statiska versionen. Försök använda detta istället:

event.getPlayer().getWorld().createExplosion(X, Y, Z, power);

Det är möjligt att det är något annat än "getWorld()" men liknande. Du får kolla, då jag inte har hållit på med Bukkit på väldigt länge. Denna metod hämtar iallafall instansen av World som spelaren befinner sig i.

Ett lite mer förklarat exempel:

@EventHandler public void onPlayerItemBreakEvent (PlayerItemBreakEvent event) { Player spelare = event.getPlayer(); // Lagra spelaren som triggade eventet World spelarensWorld = spelare.getWorld(); // Lagra spelarens World instans spelarensWorld.createExplosion(0,0,0,100); // Skapa en explosion vid 0,0,0 i spelarens nuvarande värld med 100 i kraft. }

Angående andra förbättringar du kan göra så tänkte jag bara nämna lite riktlinjer när det kommer till "hur" man skriver kod i Java. Detta har inget med funktionalitet att göra utan är mer för ordning och läsbarhet osv. som är bra att kunna.

Klassnamn ska alltid börja med en stor bokstav och variabler och metoder ska alltid börja med liten bokstav.
Du kan läsa mer om sånt här: https://google.github.io/styleguide/javaguide.html

Det finns en del olika åsikter om hur man bör ha sin kod, men jag tycker att Google har bra riktlinjer.

Berätta gärna om mitt tips funkade för att laga din explosions-kod. Tveka inte heller att skriva till mig om du har fler frågor.

Permalänk
Medlem

@eggplant: Tack explosions koden funkade perfekt och det var en väldigt bra förklaring, den bästa jag hittat jag lyckades lägga till ett chat meddelande själv tack vare förklaringen. Jag ska kolla över dina tips på förbättringar imorgon och fixa till koden efter riktlinjerna.

MvH Gymi

Visa signatur

Arbetstation/spel dator: CPU: Intel Xeon E5 2670 Mobo: Z9PA-U8 GPU: GTX 980 Reference Chassi: Phanteks Enthoo Evolv ATX SSD: OCZ Trion 150 480GB RAM: 64 GB Nanya 1333mhz LRDIMM OS: Fedora 28
Server: HP proliant dl160 G6 CPU: 2x l5630 RAM: 36GB

Permalänk
Medlem

@eggplant: Jag har stött på problem igen, jag försöker lägga till så att den i join meddelandet säger hur många spelare som är online men den vill inte jag får bara event exception när jag joinar istället.

event.getPlayer().sendMessage(ChatColor.AQUA + Integer.toString(getServer().getOnlinePlayers().size()) + " Players online 2 required for game to start");

Såvitt jag förstår det så ska jag genom

Integer.toString(getServer().getOnlinePlayers().size())

kunna få fram collectionens storlek som en int men den ger som sagt bara en error. Baserat på vad jag kan tolka från API Documentationen

Visa signatur

Arbetstation/spel dator: CPU: Intel Xeon E5 2670 Mobo: Z9PA-U8 GPU: GTX 980 Reference Chassi: Phanteks Enthoo Evolv ATX SSD: OCZ Trion 150 480GB RAM: 64 GB Nanya 1333mhz LRDIMM OS: Fedora 28
Server: HP proliant dl160 G6 CPU: 2x l5630 RAM: 36GB

Permalänk
Medlem

@Gymi: Posta gärna hela felmeddelandet du får, där brukar finnas användbar information.

Permalänk
Keeper of Traditions

För framtiden så kan det vara bra att reda ut varför man får felet "Non-static method cannot be referenced from static context". Det är ganska viktiga koncept i objektorienterad programmering. Fundera på vad static egentligen gör och när det skulle kunna gå snett om man anropar funktionalitet som inte är static.

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk
Medlem

@Gymi: Som en annan sa skulle det vara bra att få se hela felmeddelandet men när jag läste dokumentationen som du länkade såg jag detta:

Citat:

Gets a view of all currently logged in players. This view is a reused object, making some operations like Collection.size() zero-allocation.

Detta betyder att size() aldrig kommer att fungera i detta fallet. Däremot står det att du kan konvertera Collection till en array för att säkert kunna använda den. Så prova detta för att läsa hur många spelare som är på servern:

getServer().getOnlinePlayers().toArray().length

Permalänk
Medlem

Detta är felmeddelandet jag får:

[15:33:03 INFO]: UUID of player Bitfern is 50e878c1-bc4a-4b2d-aab3-ad94f2670a0b [15:33:03 ERROR]: Could not pass event PlayerJoinEvent to AutonomousFireworks vAlpha org.bukkit.event.EventException at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot.jar:git-Spigot-96235ab-257d6cd] at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot.jar:git-Spigot-96235ab-257d6cd] at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot.jar:git-Spigot-96235ab-257d6cd] at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot.jar:git-Spigot-96235ab-257d6cd] at net.minecraft.server.v1_11_R1.PlayerList.onPlayerJoin(PlayerList.java:327) [spigot.jar:git-Spigot-96235ab-257d6cd] at net.minecraft.server.v1_11_R1.PlayerList.a(PlayerList.java:160) [spigot.jar:git-Spigot-96235ab-257d6cd] at net.minecraft.server.v1_11_R1.LoginListener.b(LoginListener.java:147) [spigot.jar:git-Spigot-96235ab-257d6cd] at net.minecraft.server.v1_11_R1.LoginListener.F_(LoginListener.java:57) [spigot.jar:git-Spigot-96235ab-257d6cd] at net.minecraft.server.v1_11_R1.NetworkManager.a(NetworkManager.java:233) [spigot.jar:git-Spigot-96235ab-257d6cd] at net.minecraft.server.v1_11_R1.ServerConnection.c(ServerConnection.java:140) [spigot.jar:git-Spigot-96235ab-257d6cd] at net.minecraft.server.v1_11_R1.MinecraftServer.D(MinecraftServer.java:842) [spigot.jar:git-Spigot-96235ab-257d6cd] at net.minecraft.server.v1_11_R1.DedicatedServer.D(DedicatedServer.java:399) [spigot.jar:git-Spigot-96235ab-257d6cd] at net.minecraft.server.v1_11_R1.MinecraftServer.C(MinecraftServer.java:678) [spigot.jar:git-Spigot-96235ab-257d6cd] at net.minecraft.server.v1_11_R1.MinecraftServer.run(MinecraftServer.java:576) [spigot.jar:git-Spigot-96235ab-257d6cd] at java.lang.Thread.run(Unknown Source) [?:1.8.0_121] Caused by: java.lang.NullPointerException at BigBrother.onPlayerJoinEvent(BigBrother.java:39) ~[?:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_121] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_121] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_121] at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_121] at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot.jar:git-Spigot-96235ab-257d6cd] ... 14 more [15:33:03 INFO]: Bitfern[/127.0.0.1:51675] logged in with entity id 11 at ([world]1.5901491749968915, 42.49390748022948, 3.6726476487840602)

BigBrother är Event klassen BTW

Jag får samma fel även efter jag har gjort ändringen föreslagen av @eggplant

@Dunder Absolut jag ska läsa på om Static när jag får möjlighet. Jag håller på med Java kursen på SoloLearn just nu om du har några tips på andra sidor så är jag öppen för förslag.

Visa signatur

Arbetstation/spel dator: CPU: Intel Xeon E5 2670 Mobo: Z9PA-U8 GPU: GTX 980 Reference Chassi: Phanteks Enthoo Evolv ATX SSD: OCZ Trion 150 480GB RAM: 64 GB Nanya 1333mhz LRDIMM OS: Fedora 28
Server: HP proliant dl160 G6 CPU: 2x l5630 RAM: 36GB

Permalänk
Medlem

Haha, Derp jag måste ha råkat ta bort raderna för att ge spelaren rustning men lämnat enchant raderna. Nu funkar det

Visa signatur

Arbetstation/spel dator: CPU: Intel Xeon E5 2670 Mobo: Z9PA-U8 GPU: GTX 980 Reference Chassi: Phanteks Enthoo Evolv ATX SSD: OCZ Trion 150 480GB RAM: 64 GB Nanya 1333mhz LRDIMM OS: Fedora 28
Server: HP proliant dl160 G6 CPU: 2x l5630 RAM: 36GB