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

Trädvy Permalänk
Medlem
Registrerad
Sep 2014

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

Arbetstation/spel dator: CPU: Intel Xeon E5 2670 Mobo: Z9PA-U8 GPU: Saphire R9 390 nitro Chassi: NZXT H440 SSD: Samsung 840 evo 120GB och OCZ Trion 150 480GB RAM: 64 GB Nanya 1333mhz LRDIMM OS: Fedora 25
Server: HP proliant dl160 G6 CPU: 2x l5630 RAM: 36GB

Trädvy Permalänk
Medlem
Registrerad
Mar 2017

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.

Trädvy Permalänk
Medlem
Registrerad
Sep 2014

@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

Arbetstation/spel dator: CPU: Intel Xeon E5 2670 Mobo: Z9PA-U8 GPU: Saphire R9 390 nitro Chassi: NZXT H440 SSD: Samsung 840 evo 120GB och OCZ Trion 150 480GB RAM: 64 GB Nanya 1333mhz LRDIMM OS: Fedora 25
Server: HP proliant dl160 G6 CPU: 2x l5630 RAM: 36GB

Trädvy Permalänk
Medlem
Registrerad
Sep 2014

@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

Arbetstation/spel dator: CPU: Intel Xeon E5 2670 Mobo: Z9PA-U8 GPU: Saphire R9 390 nitro Chassi: NZXT H440 SSD: Samsung 840 evo 120GB och OCZ Trion 150 480GB RAM: 64 GB Nanya 1333mhz LRDIMM OS: Fedora 25
Server: HP proliant dl160 G6 CPU: 2x l5630 RAM: 36GB

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

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

Trädvy Permalänk
Medlem
Plats
Bästkusten
Registrerad
Jun 2009

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.

|| Intel 8700K || MSI GTX 1080 TI Gaming X || Xonar DG || Samsung 750 EVO 500GB & OCZ Agility 3 120GB & Samsung 960 EVO 250GB & Crucial V4 256GB || XFX XXX 650W || 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.

Trädvy Permalänk
Medlem
Registrerad
Mar 2017

@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

Trädvy Permalänk
Medlem
Registrerad
Sep 2014

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

@DunderKlumpen 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.

Arbetstation/spel dator: CPU: Intel Xeon E5 2670 Mobo: Z9PA-U8 GPU: Saphire R9 390 nitro Chassi: NZXT H440 SSD: Samsung 840 evo 120GB och OCZ Trion 150 480GB RAM: 64 GB Nanya 1333mhz LRDIMM OS: Fedora 25
Server: HP proliant dl160 G6 CPU: 2x l5630 RAM: 36GB

Trädvy Permalänk
Medlem
Registrerad
Sep 2014

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

Arbetstation/spel dator: CPU: Intel Xeon E5 2670 Mobo: Z9PA-U8 GPU: Saphire R9 390 nitro Chassi: NZXT H440 SSD: Samsung 840 evo 120GB och OCZ Trion 150 480GB RAM: 64 GB Nanya 1333mhz LRDIMM OS: Fedora 25
Server: HP proliant dl160 G6 CPU: 2x l5630 RAM: 36GB