Fehler beim erstellen einer API

  • Hallo,


    ich versuche gerade eine kleine API zu bauen und bekomme volgende Fehlermeldung beim Starten von RW.
    möchte mit einer protected void INI()" Funktion Arbeiten, in NetBeans gibt es keine Probleme beim einbinden der Class.
    Was Fehlt damit er instantiate kann?


    RW SERVER: Fatal error occurred! pluginapi.PluginException: SpracheAPI: Cannot instantiate plugin main class: "de.chaoswg.SprachAPI" at pluginapi.PluginLoader.loadPlugin(SourceFile:274) at pluginapi.PluginLoader.loadPluginFromJar(SourceFile:194) at pluginapi.PluginLoader.loadPlugins(SourceFile:45) at pluginapi.PluginManager.initialize(SourceFile:67) at server.Main.e(SourceFile:517) at server.Main.initApplication(SourceFile:282) at commons.JIWApplication.initialize(SourceFile:236) at com.jme3.system.NullContext.initInThread(NullContext.java:87) at com.jme3.system.NullContext.run(NullContext.java:130) at java.lang.Thread.run(Unknown Source)

  • Poste am besten einmal den Code der Klasse hier :) Der Fehler, dass die Klasse nicht instantiiert werden kann, tritt meist entweder auf, wenn der Konstruktor private oder protected ist, oder wenn die Klasse abstrakt ist.


    PS: Beim Posten von Source-Code oder auch Fehlermeldungen am besten einen Code Block </> verwenden ;) Denn mit dem [tt] ist Mehrzeiligkeit nicht möglich, was das ganze dann unlesbar macht^^

  • Danke für den Code :thumbup: Das Problem liegt darin, dass unbedingt ein leerer Konstruktor vorhanden sein muss, oder genauer ausgedrückt, ein Konstruktor, welcher keine Parameter entgegennimmt. Wenn kein Konstruktor definiert ist, ist so ein Konstruktor in Java immer automatisch vorhanden.
    Da du bei dir aber den Konstruktor mit einem "plugin" Parameter erstellt hast, verschwindet der Standardkonstruktor automatisch - es sei denn, du deklarierst den ebenfalls.


    Die "direkte Lösung" (wenngleich falsche Lösung) wäre, einen zweiten Konstruktor ohne Parameter hinzuzufügen:

    Java
    public SprachAPI(){
    }


    Das ist allerdings sicherlich nicht das, was deiner Intention entspricht. Dein Konstruktor enthält den "Plugin" Parameter, falls du da eine Referenz auf das SprachAPI Objekt erwartest, dann lass diesen Parameter ganz weg, da SprachAPI ja direkt auf sich selbst zugreifen kann (du kannst also innerhalb der Klasse SprachAPI sowieso direkt auf die eigenen Plugin-Methoden wie zB "getDescription()" oder "getPath()" zugreifen). In dem Fall ist es ggf. besser, nicht mit einem Konstruktor zu arbeiten (da dieses Plugin-Objekt zu diesem Zeitpunkt noch nicht ganz initialisiert ist), sondern den Code, der jetzt im Konstruktor ist, lieber in die "onEnable()" Funktion zu packen (diese wird dann aufgerufen, wenn das Plugin voll initialisiert und geladen ist).


    Falls da als Parameter jedoch ein ganz anderes Plugin erwartet wird, würde ich das lieber auslagern in eine separate Klasse o.ä., denn SprachAPI ist ja bereits ein Objekt vom Typ Plugin (denn auch hier ist wieder die Sache, dass andere Plugins zum Zeitpunkt des Konstruktor-Aufrufs u.U. noch nicht initialisiert sind).

  • Erstmal Danke fürs promte Antworten.


    Da hast du recht der Code soll schon sauber sein und nach den Regeln der Kunst.


    Also das mit dem Leeren Konstruktor hat wunderbar Funktioniert. :thumbsup:
    Nur kann ich natürlich nicht alles einfach in die onEnable reinschieben ohne NullPointerException zu bekommen. Das strukturiere ich nachher um wenn die Augen wieder weiter aufgehen und das Hirn mehr als zwei Zeilen Springen kann. :sleeping:

  • Frage geht das überhaupt?


    mann soll nachher einer Class

    Code
    class wgClassText extends SprachAPI {
    @Override
    protected void setDaten(){
    this.Sprache.add("en");
    this.Sprache.add("de");
    this.Daten = new String[][] {
    {"Variable 1","en 1","de 1"},
    {"Variable 2","en 2","de 2"}
    }
    }

    Die Variablen Setzen können.
    habe sie erstmal in eine INI-Funktion gesetzt die nach der initialiesierung in der Haupt Class aufgerufen wird.
    textDaten = new wgClassText();
    textDaten.INI();
    Bekomme ich immer noch einen NullPointerException wenn ich danach auf die Variablen zugreifen möchte.

  • Nur kann ich natürlich nicht alles einfach in die onEnable reinschieben ohne NullPointerException zu bekommen.

    Dann liegt das aber am Code, denn das ist so der vorgesehene Weg :) Denn es ist nicht vorgesehen, dass eigene Instanzen einer Plugin-Klasse erzeugt werden. Das Spiel bzw. der Server sind die einzigen, welche neue Plugin-Instanzen erzeugen dürfen, denn von selbsterzeugten Instanzen weiß das Spiel bzw. der Server nichts (somit würden auch die meisten der Plugin-Methoden für diese selbsterzeugten Instanzen nicht funktionieren). Natürlich kannst du trotzdem mit Klassen und eigenen Objekten arbeiten, OOP ist ja weiterhin möglich (und auch zu bevorzugen), aber diese sollten dann am besten nicht von Plugin abgeleitet sein.


    Im Zweifelsfall kannst du die Version mit dem Code in "onEnable()" einmal hier posten mit ggf. dem Hinweis, in welcher Zeile die NPE auftritt ;)

Participate now!

Don’t have an account yet? Create a new account now and be part of our community!