# Fragen zu HashMaps



## Cury (1. Jan 2020)

Hallo alle,
Ich bin dabei ein Plugin zuschreiben, welches einem Spieler ermöglicht, seine Spitzhacken durch das abbauen von Blöcken zu leveln. Für jeden abgebauten Block soll die Spitzhacke 1 XP bekommen. Diese Xp werden in der Lore des Items gesetzt. 
Problem:
Ich habe es bis jetzt mit einer einzigen Variable gemacht. Dies funktioniert natürlich nicht, da dann auf allen Spitzhacken der Gleiche wert ist. Ich habe versucht das folgendermaßen zu lösen:

         ItemStack i = p.getItemInHand();
         HashMap<ItemStack, Integer> level = new HashMap<>();
                          int xp= level.get(i);
                         xp++;                    
                         level.put(i, xpd);


  Bei dieser Variante bekomme ich eine NullPointerExeption. Diese entsteht bei der Inizialisierung von int xp. 

Ich versuche in der HashMap die Xp Anzahl, die für die abgebauten Blöcke stehen, in dem ItemStack, also der Spitzhacke zu speichern, dann zu getten, beim abbauen 1 hochzusetzten, und dann wieder in der HashMap zu Speichern.  

Ich fände es toll wenn mir jemand helfen könnte.
Das ist das einzige was noch nicht geht. Alles andere klappt fehlerlos. 

LG Julius


----------



## Cury (1. Jan 2020)

Falls ich den Rest des Plugins schicken soll, bitte einfach schreiben.


----------



## httpdigest (1. Jan 2020)

```
int xp = level.getOrDefault(i, 0);
```


----------



## Cury (1. Jan 2020)

jetzt ist zwar der Fehler weg, aber jetzt Zählt der die Xp nicht mehr hoch, sondern bleibt immer bei 1


----------



## kneitzel (1. Jan 2020)

Falls die paar Zeilen Code so zusammen in einer Methode stehen, dann ist das selbstverständlich, denn du erzeugst ja ständig eine neue HashMap die dann nur in einer lokalen Variable gespeichert ist.


----------



## Cury (1. Jan 2020)

Jetzt wird es hochgezählt, allerdings sehr unregelmäßig, aslo alle 10 Blöcke doer so und nach 10 gefarmten blöcken wird die Hashmap wieder gecleart


----------



## kneitzel (1. Jan 2020)

Kannst Du uns mehr von dem Code zeigen? Ohne Details wird Dir hier kaum jemand helfen können fürchte ich.


----------



## Cury (1. Jan 2020)

ok kommt: 





						Hastebin: Send and Save Text or Code Snippets for Free | Toptal®
					

Hastebin is a free web-based pastebin service for storing and sharing text and code snippets with anyone. Get started now.



					hastebin.com
				



geht das so?


----------



## Xyz1 (1. Jan 2020)

Das ist wie Raten...
Bitte mehr Code, Erklärungen usw usf ...
Und achte etwas auf Deine Rechtschreibung...
Und - wie man Fragen stellen sollte im Allgemeinen.
Danke.


----------



## Xyz1 (1. Jan 2020)

Cury hat gesagt.:


> ok kommt:
> 
> 
> 
> ...


Nein, das Forum ist dazu gedacht Code auch hier zu posten.


----------



## Cury (1. Jan 2020)

ok sorry. Ich werde darauf Achten


----------



## Cury (1. Jan 2020)

.


----------



## kneitzel (1. Jan 2020)

Wie ist der HashCode von ItemStack implementiert? Ist sicher gestellt, dass der HashCode der ItemStack Instanzen sich nicht verändert mit der Zeit? Das wäre jetzt eine Möglichkeit, die mir einfällt. Der Code selbst ist recht unübersichtlich- jetzt auf dem Handy ist da ein Überblick schwer. Aber der Code verschreckt etwas ... wie lang ist da eine Methode? Und die vielen if else if .... aber ich schaue mal, dass ich da morgen evtl. noch das eine oder andere dazu schreibe ....


----------



## Cury (2. Jan 2020)

Danke an alle die mir hier Lösungsvorschläge geschickt haben. Ich habe jetzt eine mögliche Lösung gefunden. 
Der Fehler war, dass die Items zu 100% gleich sind und deshalb nimmt er immer den gleichn wert. Hat jemand eine Idee in welcher Form Items unterschiedlich sind, oder wie man sie unterschiedlich machen kann. 
Mit dem Displayname würde es halt gehen, aber dann könnte man die Items umbenennen.

Gibt es bei Items sowas wie UUID, wie bei Spielern?


----------



## kneitzel (2. Jan 2020)

Wenn Du Klassen schreibst, dann kannst Du da auch eine UUID einfügen. Es liegt doch an Dir als Entwickler, vorzugeben, was welche Klasse beinhalten soll.

Somit kannst Du in eine Klasse einbauen:

```
private UUID id = UUID.randomUUID();
public UUID getId() { return id; }
```

Edit: Wobei die Frage ist, ob so etwas überhaupt notwendig ist. Du hast doch unterschiedliche Instanzen und die wirst Du doch auseinander halten können. (Und da liegt es an Dir, vernünftige equals und hashcode Methoden zu definieren!)


----------



## kneitzel (2. Jan 2020)

Und da Du den Code wieder raus gelöscht hast aus dem Link wird es dazu auch kein Feedback mehr geben können.


----------



## Cury (2. Jan 2020)

Ok danke. Den Code kann ich nochmal schicken.

Also kann ich items eine Rnadom UUID geben und dann die UUID in die HashMap packen? 
Mein Ziel ist halt, dass alle Items einzigartig sind und dann diese Einzigartigkeit in die HashMap zu packen.


----------



## kneitzel (2. Jan 2020)

Das ist EINE Möglichkeit. Die Frage ist aber doch: Brauchst Du diese Art der Identifikation wirklich? Nach meinem Verständnis hast Du aber unterschiedliche Instanzen und die sind doch schon per se unterschiedlich. Daher macht es aus meiner Sicht derzeit wenig Sinn, da so eine UUID einzufügen.

Die Punkte, die also zu klären wären:
a) Wieso werden zwei Instanzen als gleich angesehen? Was hast Du da für Code drinnen? Die equals Methode von Object sollte zwei Instanzen sauber auseinander halten auch wenn die Instanzvariablen gleich sind. Also wirst Du da eine equals Methode geschrieben haben (oder schreiben lassen, falls Du z.B. Lombok einsetzt).
b) Die Problematik wird dann evtl. auch kritisch, wenn Du etwas nutzt, dass mit Hashcodes arbeitet. Es ist absolut kritisch, wenn Du einen Key nutzt, der sich verändert und dabei der hashcode auch verändert wird. Dann wird ein key plötzlich nicht mehr gefunden und so.

==> Statt irgendwelcher "schneller Fixes" wäre mein Ratschlag, sich die Details genau anzusehen und zu begreifen, was wieso passiert. So eine schnelle Behebung führt zu mehreren Dingen:
- zu komplizierter Code, da Dinge enthalten sind, die unnötig sind.
- fehlerhafter Code - Du wirst Dinge haben, die nicht das machen, was Du erwartest. Das führt schnell zu Folgefehlern die dann immer schwerer zu finden und zu diagnostizieren sind.
- Nicht wartbarer Code, da Code schlicht nicht im Detail verstanden wurde.


----------



## Cury (2. Jan 2020)

Hier nochmal der Code:


```
HashMap<String, Integer> dia = new HashMap<>();
	
	@EventHandler
	public void onBreak(BlockBreakEvent e) {
		Player p = e.getPlayer();
		if(p.getLocation().getWorld().getName().equals("world")) {
		
		if(p.getItemInHand().getType() == Material.DIAMOND_PICKAXE) {
			final ItemStack i = p.getItemInHand();
			ItemMeta im = i.getItemMeta();
			if(i.getItemMeta().getLore().contains("§6§lUpgrade I")) {
				
				if(i.getItemMeta().getLore().contains("§6Level: §715")) {
					return;
				}
				
				if(i.getItemMeta().getLore().contains("§6Level: §71") || i.getItemMeta().getLore().contains("§6Level: §72") || i.getItemMeta().getLore().contains("§6Level: §73") || i.getItemMeta().getLore().contains("§6Level: §74") ||i.getItemMeta().getLore().contains("§6Level: §75") || i.getItemMeta().getLore().contains("§6Level: §76") || i.getItemMeta().getLore().contains("§6Level: §77") || i.getItemMeta().getLore().contains("§6Level: §78") || i.getItemMeta().getLore().contains("§6Level: §79") || i.getItemMeta().getLore().contains("§6Level: §710") || i.getItemMeta().getLore().contains("§6Level: §711") || i.getItemMeta().getLore().contains("§6Level: §712") || i.getItemMeta().getLore().contains("§6Level: §713") || i.getItemMeta().getLore().contains("§6Level: §714") || i.getItemMeta().getLore().contains("§6Level: §715")) {
					
					int xpd = dia.getOrDefault(i.getItemMeta().getDisplayName(), 0);
					xpd++;
					dia.put(i.getItemMeta().getDisplayName(), xpd);
					
					
					if(xpd < 200 && xpd > 0) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§6200 XP", "§6Level: §71", " ", "§6§lUpgrade I"));
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd == 200) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§6600 XP", "§6Level: §72", " ", "§6§lUpgrade I"));
						p.sendMessage(Main.pre + "§aDeine Spitzhacke ist nun §6Level 2");
						p.playSound(p.getLocation(), Sound.LEVEL_UP, 1L, 1L);
						im.addEnchant(Enchantment.DIG_SPEED, 1, false);
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd < 600 && xpd > 200) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§6600 XP", "§6Level: §72", " ", "§6§lUpgrade I"));
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd == 600) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§61500 XP", "§6Level: §73", " ", "§6§lUpgrade I"));
						p.sendMessage(Main.pre + "§aDeine Spitzhacke ist nun §6Level 3");
						p.playSound(p.getLocation(), Sound.LEVEL_UP, 1L, 1L);
						im.addEnchant(Enchantment.DIG_SPEED, 2, false);
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd < 1500 && xpd > 600) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§61500 XP", "§6Level: §73", " ", "§6§lUpgrade I"));
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd == 1500) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§65000 XP", "§6Level: §74", " ", "§6§lUpgrade I"));
						p.sendMessage(Main.pre + "§aDeine Spitzhacke ist nun §6Level 4");
						p.playSound(p.getLocation(), Sound.LEVEL_UP, 1L, 1L);
						im.addEnchant(Enchantment.DURABILITY, 1, false);
						im.addEnchant(Enchantment.DIG_SPEED, 2, false);
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd < 5000 && xpd > 1500) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§65000 XP", "§6Level: §74", " ", "§6§lUpgrade I"));
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd == 5000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§615000 XP", "§6Level: §75", " ", "§6§lUpgrade I"));
						p.sendMessage(Main.pre + "§aDeine Spitzhacke ist nun §6Level 5");
						p.playSound(p.getLocation(), Sound.LEVEL_UP, 1L, 1L);
						im.addEnchant(Enchantment.DURABILITY, 2, false);
						im.addEnchant(Enchantment.DIG_SPEED, 2, false);
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd < 15000 && xpd > 5000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§615000 XP", "§6Level: §75", " ", "§6§lUpgrade I"));
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd == 5000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§615000 XP", "§6Level: §75", " ", "§6§lUpgrade I"));
						p.sendMessage(Main.pre + "§aDeine Spitzhacke ist nun §6Level 5");
						p.playSound(p.getLocation(), Sound.LEVEL_UP, 1L, 1L);
						im.addEnchant(Enchantment.DURABILITY, 3, false);
						im.addEnchant(Enchantment.DIG_SPEED, 3, false);
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd < 15000 && xpd > 5000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§615000 XP", "§6Level: §75", " ", "§6§lUpgrade I"));
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd == 15000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§630000 XP", "§6Level: §76", " ", "§6§lUpgrade I"));
						p.sendMessage(Main.pre + "§aDeine Spitzhacke ist nun §6Level 6");
						p.playSound(p.getLocation(), Sound.LEVEL_UP, 1L, 1L);
						im.addEnchant(Enchantment.DURABILITY, 4, true);
						im.addEnchant(Enchantment.DIG_SPEED, 4, false);
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd < 30000 && xpd > 15000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§630000 XP", "§6Level: §76", " ", "§6§lUpgrade I"));
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd == 30000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§670000 XP", "§6Level: §77", " ", "§6§lUpgrade I"));
						p.sendMessage(Main.pre + "§aDeine Spitzhacke ist nun §6Level 7");
						p.playSound(p.getLocation(), Sound.LEVEL_UP, 1L, 1L);
						im.addEnchant(Enchantment.DURABILITY, 5, true);
						im.addEnchant(Enchantment.DIG_SPEED, 5, false);
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd < 70000 && xpd > 30000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§670000 XP", "§6Level: §77", " ", "§6§lUpgrade I"));
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd == 70000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§6150000 XP", "§6Level: §78", " ", "§6§lUpgrade I"));
						p.sendMessage(Main.pre + "§aDeine Spitzhacke ist nun §6Level 8");
						p.playSound(p.getLocation(), Sound.LEVEL_UP, 1L, 1L);
						im.addEnchant(Enchantment.DURABILITY, 5, true);
						im.addEnchant(Enchantment.DIG_SPEED, 6, true);
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd < 150000 && xpd > 70000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§6150000 XP", "§6Level: §78", " ", "§6§lUpgrade I"));
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd == 150000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§6300000 XP", "§6Level: §79", " ", "§6§lUpgrade I"));
						p.sendMessage(Main.pre + "§aDeine Spitzhacke ist nun §6Level 9");
						p.playSound(p.getLocation(), Sound.LEVEL_UP, 1L, 1L);
						im.addEnchant(Enchantment.DURABILITY, 5, true);
						im.addEnchant(Enchantment.DIG_SPEED, 7, true);
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd < 300000 && xpd > 150000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§6300000 XP", "§6Level: §79", " ", "§6§lUpgrade I"));
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd == 300000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§6700000 XP", "§6Level: §710", " ", "§6§lUpgrade I"));
						p.sendMessage(Main.pre + "§aDeine Spitzhacke ist nun §6Level 10");
						p.playSound(p.getLocation(), Sound.LEVEL_UP, 1L, 1L);
						im.addEnchant(Enchantment.DURABILITY, 5, true);
						im.addEnchant(Enchantment.DIG_SPEED, 7, true);
						im.addEnchant(Enchantment.LOOT_BONUS_BLOCKS, 1, false);
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd < 700000 && xpd > 300000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§6700000 XP", "§6Level: §710", " ", "§6§lUpgrade I"));
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd == 700000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§61200000 XP", "§6Level: §711", " ", "§6§lUpgrade I"));
						p.sendMessage(Main.pre + "§aDeine Spitzhacke ist nun §6Level 11");
						p.playSound(p.getLocation(), Sound.LEVEL_UP, 1L, 1L);
						im.addEnchant(Enchantment.DURABILITY, 6, true);
						im.addEnchant(Enchantment.DIG_SPEED, 7, true);
						im.addEnchant(Enchantment.LOOT_BONUS_BLOCKS, 1, false);
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd < 1200000 && xpd > 700000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§61200000 XP", "§6Level: §711", " ", "§6§lUpgrade I", "§6§lLevel I"));
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd == 1200000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§62000000 XP", "§6Level: §712", " ", "§6§lUpgrade I",  "§6§lLevel I"));
						p.sendMessage(Main.pre + "§aDeine Spitzhacke ist nun §6Level 12");
						p.playSound(p.getLocation(), Sound.LEVEL_UP, 1L, 1L);
						im.addEnchant(Enchantment.DURABILITY, 7, true);
						im.addEnchant(Enchantment.DIG_SPEED, 8, true);
						im.addEnchant(Enchantment.LOOT_BONUS_BLOCKS, 1, false);
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd < 2000000 && xpd > 1200000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§62000000 XP", "§6Level: §712", " ", "§6§lUpgrade I", "§6§lLevel I"));
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd == 2000000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§63400000 XP", "§6Level: §713", " ", "§6§lUpgrade I", "§6§lLevel I"));
						p.sendMessage(Main.pre + "§aDeine Spitzhacke ist nun §6Level 13");
						p.playSound(p.getLocation(), Sound.LEVEL_UP, 1L, 1L);
						im.addEnchant(Enchantment.DURABILITY, 7, true);
						im.addEnchant(Enchantment.DIG_SPEED, 10, true);
						im.addEnchant(Enchantment.LOOT_BONUS_BLOCKS, 1, false);
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd < 3400000 && xpd > 2000000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§63400000 XP", "§6Level: §713", " ", "§6§lUpgrade I", "§6§lLevel I"));
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd == 3400000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§65000000 XP", "§6Level: §714", " ", "§6§lUpgrade I", "§6§lLevel I"));
						p.sendMessage(Main.pre + "§aDeine Spitzhacke ist nun §6Level 14");
						p.playSound(p.getLocation(), Sound.LEVEL_UP, 1L, 1L);
						im.addEnchant(Enchantment.DURABILITY, 8, true);
						im.addEnchant(Enchantment.DIG_SPEED, 11, true);
						im.addEnchant(Enchantment.LOOT_BONUS_BLOCKS, 2, false);
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd < 5000000 && xpd > 3400000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§65000000 XP", "§6Level: §714", " ", "§6§lUpgrade I", "§6§lLevel I"));
						i.setItemMeta(im);
						p.updateInventory();
					}else if(xpd == 5000000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§67300000 XP", "§6Level: §715", " ", "§6§lUpgrade I", "§6§lLevel I"));
						p.sendMessage(Main.pre + "§aDeine Spitzhacke ist nun §6Level 15");
						p.playSound(p.getLocation(), Sound.LEVEL_UP, 1L, 1L);
						im.addEnchant(Enchantment.DURABILITY, 10, true);
						im.addEnchant(Enchantment.DIG_SPEED, 14, true);
						im.addEnchant(Enchantment.LOOT_BONUS_BLOCKS, 2, false);
						i.setItemMeta(im);
						p.updateInventory();
						
						Firework firework = p.getWorld().spawn(p.getLocation(), Firework.class);
						FireworkEffect effect = FireworkEffect.builder()
								.withColor(Color.RED)
								.flicker(true)
								.trail(true)
								.withFade(Color.AQUA)
								.with(FireworkEffect.Type.BALL_LARGE)
								.build();
								
								FireworkMeta meta = firework.getFireworkMeta();
								meta.addEffect(effect);
								meta.setPower(1);
								
								firework.setFireworkMeta(meta);
								
					}else if(xpd < 7300000 && xpd > 5000000) {
						im.setLore(Arrays.asList(" ", "§6" + xpd + "§7/§67300000 XP", "§6Level: §715", " ", "§6§lUpgrade I", "§6§lLevel I"));
						i.setItemMeta(im);
						p.updateInventory();
					}
				
					
					
					
				
			}else {
			im.setLore(Arrays.asList(" ", "§61§7/§6200 XP", "§6Level: §71", " ", "§6§lUpgrade I"));
			i.setItemMeta(im);
			p.updateInventory();
			return;
			}
			
			}else return;
		}
```


----------



## Flown (2. Jan 2020)

Wäre nett wenn du das nächste mal Code-Tags verwenden würdest: [code=java]//JAVA CODE HERE[/code]


----------



## kneitzel (2. Jan 2020)

Hmm, da hast Du jetzt paar Anpassungen drin, die vorher nicht da waren. So ist es jetzt eine HashMap mit einem String als key. Das war vorher nicht so. Wenn Du da den DisplayName wählst, ist die Frage tatsächlich, ob der eindeutig ist. Wenn der nicht eindeutig ist, dann kommt es zu dem, was Du schon erwähnt hast....

Paar Hinweise zu dem Code:
a) p.getLocation().getWorld().getName().equals("world") ist ein Konstrukt, welches ich kritisch finde. Deine Klasse hat eine Abhängigkeit zu Location, was ok ist, aber dann geht es noch weiter mit Wissen über die Welt und dass diese einen Namen hat und dass es eine spezielle Welt mit Namen "world" gibt.
==> Die Konstanten sollten nicht als Literale im Code stehen sondern als Konstanten definiert sein. Also hier in World (oder wie die Klasse heissen mag) ein `"public static final String MAIN_WORLD_NAME = "world";` oder so. Und das Wissen, wann eine Welt die Hauptwelt ist, gehört auch in die Welt Klasse. Also sowas wie:

```
public boolean isMainWorld() {
      return getName().equals(MAIN_WORLD_NAME);
  }
```
(Vereinfacht dargestellt. Validierung vom Namen wird evtl. noch gewünscht, um eine NPE zu vermeiden oder so ...)
==> Was bedeutet dies für Location? Was bedeutet das für Location? Was ist das für ein Attribut? Das wird dann evtl. sowas wie:

```
public boolean isInsideMainWorld() {
      return getWorld().isMainWorld();
  }
```

==> Und das dann auch noch für p (Player?). Wann ist ein Player in so einer Location? isInGame? Oder was wäre das?
Aber nach dem Schema von oben: Du hast dann nur noch if (p.isInGame()) und die Klasse interessiert sich nicht für Location und World und was weiss ich - nur weil es daran interessiert ist, ob ein Spieler wirklich im Spiel ist oder nicht.

b) Das ist eine Mega Methode. Die würde ich auf jeden Fall aufteilen. Was für Grenzen sind da denn aktiv? Ist das sowas wie ein Level? Würde ich entsprechend festlegen und dann hat man nur noch eine Überprüfungen an einer Stelle a.la. LevelGrenze erreicht mit einem bestimmten erreichten Level sowie das man befindet sich in einem Level oder so ....

c) Du baust da so massive Zeichenketten auf mit § und / Zeichen und so. Da scheinst Du Daten in einem String kodiert zu speichern. Da solltest Du Daten in Rohform speichern und so Du so einen String wirklich brauchst z.B. zur Ausgabe oder von mir aus zur Serialisierung, dann baust Du den String in der Klasse, die die Werte speichert, zusammen bzw. parst Du. Das ist aber auch ein Spezialwissen, das in eine Klasse gekapselt werden muss. Und dann wird ansonsten nur darauf zugegriffen. (Selbst wenn das Speichern nicht als eigenständige Klasse gewünscht wird, würde ich das zusammen ziehen in Methoden um da wenigstens nicht ständig immer wieder so Code schreiben zu müssen sondern statt dessen aussagekräftige Methoden aufrufe.)


----------



## Cury (2. Jan 2020)

Ok ich werde jetzt einfachmal die Klasse in Methoden, wie z.B: 
	
	
	
	





```
public void addXp(HashMap<String, Integer> map, ItemStack i)
```
 aufteilen. 
Danke für deine Hilfe!


----------



## JuKu (4. Jan 2020)

Du solltest auch mal darüber nachdenken, mehr JUnit Tests zu schreiben.
Dann wird 1. der Code besser und 2. fällt einem dann schneller auf, wo der Fehler liegt.


----------

