Fehler beim erstellen einer API

  • Deutsch
  • 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^^
  • Java-Quellcode

    1. /*
    2. * To change this license header, choose License Headers in Project Properties.
    3. * To change this template file, choose Tools | Templates
    4. * and open the template in the editor.
    5. */
    6. package de.chaoswg;
    7. import java.io.BufferedWriter;
    8. import java.io.File;
    9. import java.io.FileInputStream;
    10. import java.io.FileOutputStream;
    11. import java.io.FileWriter;
    12. import java.io.IOException;
    13. import java.io.PrintWriter;
    14. import java.util.ArrayList;
    15. import java.util.Collections;
    16. import java.util.Enumeration;
    17. import java.util.List;
    18. import java.util.Properties;
    19. import java.util.Vector;
    20. import net.risingworld.api.Plugin;
    21. import net.risingworld.api.objects.Player;
    22. public class SprachAPI extends Plugin {
    23. private Plugin plugin;
    24. private int debug = 1;
    25. private ArrayList<String> VariablenName;
    26. private ArrayList<String> inputText;
    27. private List<List<String>> Text;
    28. protected ArrayList<String> Sprache;
    29. protected String[ ][ ] Daten;
    30. private SortedProperties textConfig = new SortedProperties();
    31. String sFile;
    32. String sDir = "/locale";
    33. String sFileRest =".lang";
    34. File pfile;
    35. File pdir;
    36. @Override
    37. public void onEnable() {
    38. }
    39. @Override
    40. public void onDisable() {
    41. }
    42. public SprachAPI (Plugin plugin) {
    43. this.plugin = plugin;
    44. VariablenName = new ArrayList();
    45. Text = new ArrayList<>();
    46. inputText = new ArrayList();
    47. //### Standart Sprachen Setzen
    48. Sprache = new ArrayList();
    49. //Sprache.add("en");
    50. //Sprache.add("de");
    51. //Sprache=Sprachen;
    52. INI();
    53. //### Convertieren in das Arbeistformat
    54. for (String[] arr : Daten){
    55. VariablenName.add(arr[0]);
    56. inputText = new ArrayList();
    57. inputText.add(arr[1]);
    58. inputText.add(arr[2]);
    59. Text.add(inputText);
    60. }
    61. //### Verzeichnis Erstellen, wenn vorhanden Fehler egal
    62. pdir = new File(plugin.getPath() + sDir);
    63. if (pdir.mkdir()) { if(debug>0){System.out.println("[" + plugin.getDescription("name") + "]"+" Verzeichnis erstellt.");} }
    64. //### Laden und Prüfen oder Erstellen der Voreinstellungen
    65. for (int lang=0; lang< Sprache.size(); lang++) {
    66. if(debug>2){System.out.println("\n[" + plugin.getDescription("name") + "] "+"Sprache "+Sprache.get(lang));}
    67. sFile = sDir+""+Sprache.get(lang)+sFileRest;
    68. pfile = new File(plugin.getPath() + sFile);
    69. if(debug>2){System.out.println("[" + plugin.getDescription("name") + "] "+plugin.getPath() + sFile);}
    70. if(debug>2){System.out.println("[" + plugin.getDescription("name") + "] "+"File: "+pfile.toString());}
    71. if (pfile.exists()) {
    72. if(debug>0){System.out.println("[" + plugin.getDescription("name") + "] "+"Lade["+Sprache.get(lang)+"]");}
    73. try {
    74. textConfig.clear();
    75. textConfig.load(new FileInputStream(plugin.getPath() + sFile));
    76. for (int varName=0;varName<VariablenName.size();varName++){
    77. if(debug>1){System.out.print("[" + plugin.getDescription("name") + "] ");}
    78. if (textConfig.getProperty(VariablenName.get(varName))==null){
    79. textConfig.setProperty(VariablenName.get(varName), Text.get(varName).get(lang));
    80. textConfig.store(new FileOutputStream(plugin.getPath() + sFile), null);
    81. if(debug>1){System.out.print("neu ");}
    82. }else{
    83. if(debug>1){System.out.print("Lade ");}
    84. }
    85. Text.get(varName).set(lang, textConfig.getProperty(VariablenName.get(varName)));
    86. if(debug>1){System.out.println(" "+VariablenName.get(varName)+" = "+Text.get(varName).get(lang));}
    87. }
    88. }catch(IOException e){
    89. System.err.println("[" + plugin.getDescription("name") + "] "+e.getMessage());
    90. }
    91. } else {
    92. if(debug>0){System.out.println("[" + plugin.getDescription("name") + "] "+"Erstelle["+Sprache.get(lang)+"]");}
    93. try{
    94. //### Datei vorbereiten
    95. try (PrintWriter pWriter = new PrintWriter(new BufferedWriter(new FileWriter(plugin.getPath() + sFile)))) {
    96. //### Schreibt die Config! (Es werden die Standartwerte gesetzt!)
    97. if (Sprache.get(lang).equals("de")){
    98. pWriter.println("UmlauteNorm: | Ae | ae | Oe | oe | Ue | ue | ss |");
    99. pWriter.println("UmlauteCode: |Ä|ä|Ö|ö|Ü|ü|ß|");
    100. }
    101. pWriter.close(); //Datei muss erste erstellt werden, befor sie abgerufen werden kann, sonst NULL!
    102. textConfig.clear();
    103. textConfig.load(new FileInputStream(plugin.getPath() + sFile));
    104. for (int varName=0;varName<VariablenName.size();varName++){
    105. if(debug>1){System.out.println("[" + plugin.getDescription("name") + "] "+"Erstelle "+VariablenName.get(varName)+" = "+Text.get(varName).get(lang));}
    106. textConfig.load(new FileInputStream(plugin.getPath() + sFile));
    107. textConfig.setProperty(VariablenName.get(varName), Text.get(varName).get(lang));
    108. textConfig.store(new FileOutputStream(plugin.getPath() + sFile), null);
    109. }
    110. }
    111. }catch(IOException e){
    112. System.err.println("[" + plugin.getDescription("name") + "] "+"Fehler "+e.getMessage());
    113. }
    114. }
    115. textConfigRewrite(plugin.getPath() + sFile,lang);
    116. }
    117. if(debug>1){System.out.println();}
    118. File dirLange = new File(plugin.getPath() + sDir);
    119. File[] fileArray = dirLange.listFiles();
    120. if(debug>1){System.out.println("[" + plugin.getDescription("name") + "] "+fileArray.length+" von "+Sprache.size());}
    121. if (fileArray.length>Sprache.size()){
    122. int iLang = -1;
    123. for (File fFind:fileArray){
    124. if(debug>1){System.out.println("[" + plugin.getDescription("name") + "] "+fFind.getName()+" "+fFind.getName().substring(0, 2)+" "+Sprache.indexOf(fFind.getName().substring(0, 2)));}
    125. String lang = fFind.getName().substring(0, 2);
    126. if(debug>2){System.out.println("[" + plugin.getDescription("name") + "] "+lang+" "+Sprache.indexOf(lang));}
    127. if(Sprache.indexOf(lang)<0){
    128. Sprache.add(lang);
    129. sFile = sDir+"/"+lang+sFileRest;
    130. pfile = new File(plugin.getPath() + sFile);
    131. pdir = new File(plugin.getPath() + sDir);
    132. iLang = Sprache.indexOf(lang);
    133. if(debug>0){System.out.println("[" + plugin.getDescription("name") + "] "+"Lade["+lang+"]");}
    134. try {
    135. textConfig.clear();
    136. textConfig.load(new FileInputStream(plugin.getPath() + sFile));
    137. for (int varName=0;varName<VariablenName.size();varName++){
    138. if(debug>1){System.out.print("[" + plugin.getDescription("name") + "] ");}
    139. if (textConfig.getProperty(VariablenName.get(varName))==null){
    140. textConfig.setProperty(VariablenName.get(varName), Text.get(varName).get(0));
    141. textConfig.store(new FileOutputStream(plugin.getPath() + sFile), null);
    142. if(debug>1){System.out.print("neu ");}
    143. }
    144. Text.get(varName).add(textConfig.getProperty(VariablenName.get(varName)));
    145. if(debug>1){System.out.println("dazu "+Text.get(varName).get(iLang));}
    146. }
    147. textConfigRewrite(plugin.getPath() + sFile,iLang);
    148. }catch(IOException e){
    149. System.err.println("[" + plugin.getDescription("name") + "] "+e.getMessage());
    150. }
    151. }
    152. }
    153. }
    154. if(debug>1){System.out.println();}
    155. }
    156. private void textConfigRewrite(String file, int iLang){
    157. //## Datei leeren und textConfig reinschreiben
    158. if(debug>2){System.out.println("[" + plugin.getDescription("name") + "] "+"Aktualiesieren "+(VariablenName.size()+(Sprache.get(iLang).equals("de")?2:0))+" | "+textConfig.size());}
    159. (Sprache.get(iLang).equals("de")&&VariablenName.size()+2<textConfig.size()) ){
    160. if ( (VariablenName.size()+(Sprache.get(iLang).equals("de")?2:0))<textConfig.size() ){
    161. if(debug>0){System.out.println("[" + plugin.getDescription("name") + "] "+"Aktualiesieren "+"");}
    162. try (PrintWriter pWriter = new PrintWriter(new BufferedWriter(new FileWriter(file)))) {
    163. if (!Sprache.get(iLang).equals("de")){
    164. pWriter.write("");
    165. }
    166. pWriter.close(); //Datei muss erste erstellt werden, befor sie abgerufen werden kann, sonst NULL!
    167. textConfig.clear();
    168. if (Sprache.get(iLang).equals("de")){
    169. textConfig.setProperty("UmlauteNorm", "| Ae | ae | Oe | oe | Ue | ue | ss |");
    170. textConfig.store(new FileOutputStream(file), null);
    171. textConfig.setProperty("UmlauteCode", "|Ä|ä|Ö|ö|Ü|ü|ß|");
    172. textConfig.store(new FileOutputStream(file), null);
    173. }
    174. for (int varName=VariablenName.size()-1;varName>0;varName--){
    175. //System.out.println("[" + plugin.getDescription("name") + "] "+varName);
    176. if(debug>1){System.out.println("[" + plugin.getDescription("name") + "] "+"Aktualiesieren "+Text.get(varName).get(iLang));}
    177. textConfig.setProperty(VariablenName.get(varName), Text.get(varName).get(iLang));
    178. textConfig.store(new FileOutputStream(file), "-_-");
    179. }
    180. }catch(IOException e){
    181. System.err.println("[" + plugin.getDescription("name") + "] "+e.getMessage());
    182. }
    183. }
    184. }
    185. public String getText(Player player,String varName){
    186. String strLang="";
    187. //### Sprache erkennen
    188. if (player==null){strLang = player.getLanguage();}else{strLang="en";}
    189. //### Sprache Finden
    190. int iSprache = Sprache.indexOf(strLang);
    191. if (iSprache<0){iSprache=1;}
    192. if (iVariable>=0){return Text.get(iVariable).get(iSprache);}else{return null;}
    193. }
    194. /**
    195. *
    196. */
    197. protected void INI() {
    198. System.err.println("Keine Text Daten, Initialiesiert.");
    199. }
    200. class SortedProperties extends Properties {
    201. public Enumeration keys() {
    202. Enumeration keysEnum = super.keys();
    203. Vector<String> keyList = new Vector<String>();
    204. while(keysEnum.hasMoreElements()){
    205. keyList.add((String)keysEnum.nextElement());
    206. }
    207. Collections.sort(keyList);
    208. return keyList.elements();
    209. }
    210. }
    211. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von noci ()

  • 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-Quellcode

    1. public SprachAPI(){
    2. }

    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

    Quellcode

    1. class wgClassText extends SprachAPI {
    2. @Override
    3. protected void setDaten(){
    4. this.Sprache.add("en");
    5. this.Sprache.add("de");
    6. this.Daten = new String[][] {
    7. {"Variable 1","en 1","de 1"},
    8. {"Variable 2","en 2","de 2"}
    9. }
    10. }
    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.
  • noci schrieb:

    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 ;)