2016-07-29 54 views
0

Ich bin nicht sehr kompetent in Java, ich fange gerade erst an. Es entstand jedoch die Notwendigkeit, die Arbeit eines anderen für meine eigenen Zwecke zu aktualisieren (privat, natürlich). Als ich anfing, das Plugin zu aktualisieren (dies ist speziell für einen Spigot Minecraft Server), stieß ich auf eine Menge schlampigen Codes und viele, viele Fehler. Dieser hat mich als Neuling in der Java-Szene ratlos gemacht.Aktualisieren alten Code, aber es hat jetzt Vorwärtsdeklaration Fehler

Der Code ist für einen Base64-Decoder.

private static final char[] map1 = new char[64]; 

static { int i = 0; 
    for (char c = 'A'; c <= 'Z'; c = (char)(c + '\001')) map1[(i++)] = c; 
    for (char c = 'a'; c <= 'z'; c = (char)(c + '\001')) map1[(i++)] = c; 
    for (char c = '0'; c <= '9'; c = (char)(c + '\001')) map1[(i++)] = c; 
    map1[(i++)] = '+';map1[(i++)] = '/'; 

    map2 = new byte['<nonunicodechar>']; // It appears as a square in IntelliJ, assuming it's not unicode (see below) 

    for (int i = 0; i < map2.length; i++) map2[i] = -1; 
    for (int i = 0; i < 64; i++) { map2[map1[i]] = ((byte)i); 
    } 
} 

public static final byte[] map2; 

Die Themen geworfen sind, dass map2 eine illegale Vorwärts-Referenz ist, und dass ‚i‘ ist bereits in ihrem Umfang definiert.

Was die byte['']; sieht wie folgt aus

Code

+0

Nicht genau Ihre Q, aber: (1) 'C++' oder 'c + = 1' behandelt die Umwandlung in' char' für Sie (2) Das Feld wird normalerweise als Ersatz für nicht darstellbare Java-Zeichen und angezeigt so _could_ viele Dinge, aber ich würde wetten, es ist _probably_ '(char) 127' alias' \ u007F'; Je nachdem, welche (r) Editor (en) Sie verwenden, können Sie den zugrundeliegenden Code erhalten, oder auf einem Unixy-System "od" oder "xxd" oder ähnliches in der Datei verwenden (3), wenn Spigot Oracle Java, die aktuelle Version (8) hat ['java.util.Base64' click doc] (https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html) in der Standard-Bibliothek, die einfacher sein kann –

+0

@ dave_thompson_085 Ja, ich habe bemerkt, dass es jetzt enthalten ist, und der einzige Grund, warum ich diesen Code verwende, ist, weil eine andere Klasse auf diesen base64-Decoder angewiesen ist. Ich bin mir nicht sicher, wie ich die integrierte Version (wiederum sehr grundlegendes Wissen) hier implementieren würde. – AssassinsKeeper

Antwort

1

Wenn ich mich richtig erinnere, ein statischer Konstruktor wie dies selbst nur einfügen in die Ordnung der normalen Klasse Initialisierung. In Ihrem Fall wird also map1 deklariert, dann wird der statische Codeblock ausgeführt, dann wird map deklariert.

Versuchen Sie, die Deklaration von map2 über den statischen Codeblock zu verschieben.

+0

Dies wurde versucht und unter 'private static final char [] map1 = char [64]; 'verschoben, aber jetzt wird der unbekannte Klassenfehler für map2 ausgegeben. Ich nehme an, ich habe es an die falsche Stelle gebracht? – AssassinsKeeper

+0

Nein, das ist der richtige Ort ... und es klingt, als hätte es dein erstes Problem gelöst und einen anderen entdeckt ... Könntest du die Details des unbekannten Klassenfehlers posten? Auch habe ich gerade das Problem mit "i" bemerkt. Sie haben es am Anfang des statischen Blocks deklariert, aber dann versuchen Sie es später in Ihren for-Schleifen erneut zu deklarieren ... versuchen Sie, Ihre for-Schleifenvariablen auf "j" oder etwas Beschreibenderes zu ändern. –

+0

Entschuldigung, das hat so für die Antwort genommen. Wenn ich es auf einem Unixy-System bearbeitet habe, ist die Zeile 'map2 = new byte [''];'. Das wirft auch einen Fehler "leeres Zeichen-Literal". Wenn ich es zu etwas anderem ändere, heißt es, dass das neue "i" niemals benutzt wird. – AssassinsKeeper