"java.util.HashMap.get(Object)" is null

Hallo,
wie der Titel schon andeutet bekomme ich einen Error den ich nicht so ganz verstehe -> also was er mir sagt schon, aber warum versteh ich nicht.
Java:
    public static String decode (String key, String text) {
        char[] chars = text.toUpperCase().toCharArray();
        char[] keys = key.toUpperCase().toCharArray();
        char[] letters = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K','L', 'M', 'N','O','P','Q', 'R', 'S','T','U','V','W','X', 'Y', 'Z'};
        HashMap map = new HashMap<>();
        char[] shift = new char[26];
        char[] output = new char[chars.length];
        for (int i = 0; i<chars.length; i++){
            int shifter = i% keys.length;
            map.clear();
            shift[0] = keys[shifter];
            for (int j = 1; j<shift.length; j++){
                int k = 0;
                if ((keys[shifter] +j) <= 'Z'){
                    shift[j] = (char) (keys[shifter] +j);
                }
                else{
                    shift[j] = (char) ('A' + k);
                    k++;
                }
                map.put(letters[j], shift[j]);
            }
            output[i] = (char) map.get(chars[i]);
        }

Das ist der Code bei dem dieser Error auftaucht. So wie er in meinem Kopf funktioniert sollte das Hashmap object nie null sein...
Ich hoffe mir kann irgendjemand helfen

PS: Hier noch die vollständige ErrorMeldung
Code:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.lang.Character.charValue()" because the return value of "java.util.HashMap.get(Object)" is null
    at decode.key.decode(key.java:39)
 
Java:
for (int j = 1; j<shift.length; j++){
Du überspringst j=0 und damit das große A

Zum anderen würde ich vor dem Zugriff mit get einfach mal folgendes einfügen:

Java:
System.out.println(char[i]);
(Oder mit dem Debugger durchgehen)

Vielleicht ist im Eingabetext ja ein Leerzeichen oder Sonderzeichen vorhanden
 
Wann immer man ein Problem mit einem konkreten Code hat, ist es immer eine gute Idee, ein sogenanntes MCVE (minimal, complete and verifiable example) als Code zu geben. Du hast nur die Methode gegeben, aber z.B. nicht, wie/womit du sie aufrufst. Also eine main() Methode z.B., die mit konkreten Argumenten deine Methode aufruft.
Wenn du das tust, dann ist es für Antwortende sehr viel einfacher, genauer zu identifizieren, wo der Fehler ist - weil sie letztlich genau das tun können, was du selbst hättest tun können: Mit einem Debugger über den Code gehen und die Werte von Variablen und deiner Map anschauen und durchsteppen.
 
Wann immer man ein Problem mit einem konkreten Code hat, ist es immer eine gute Idee, ein sogenanntes MCVE (minimal, complete and verifiable example) als Code zu geben. Du hast nur die Methode gegeben, aber z.B. nicht, wie/womit du sie aufrufst. Also eine main() Methode z.B., die mit konkreten Argumenten deine Methode aufruft.
Wenn du das tust, dann ist es für Antwortende sehr viel einfacher, genauer zu identifizieren, wo der Fehler ist - weil sie letztlich genau das tun können, was du selbst hättest tun können: Mit einem Debugger über den Code gehen und die Werte von Variablen und deiner Map anschauen und durchsteppen.
Macht Sinn, hab ich vergessen. Das ist die Main Methode:
Java:
    public static void main(String[] args) {
        try {
            System.out.print("Enter the key: ");
            String keys = bfr.readLine();
            System.out.print("Enter the text: ");
            String text = bfr.readLine();

            System.out.print(key.decode(keys, text));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
 
Java:
for (int j = 1; j<shift.length; j++){
Du überspringst j=0 und damit das große A

Zum anderen würde ich vor dem Zugriff mit get einfach mal folgendes einfügen:

Java:
System.out.println(char[i]);
(Oder mit dem Debugger durchgehen)

Vielleicht ist im Eingabetext ja ein Leerzeichen oder Sonderzeichen vorhand
Jetzt hats funktioniert zumindest ohne Error, die Zeichen sitmmen noch nicht, aber das kann nicht so kompliziert sein 🙂. Danke!
 
Macht Sinn, hab ich vergessen. Das ist die Main Methode:
Java:
    public static void main(String[] args) {
        try {
            System.out.print("Enter the key: ");
            String keys = bfr.readLine();
            System.out.print("Enter the text: ");
            String text = bfr.readLine();

            System.out.print(key.decode(keys, text));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
Für die Zukunft: Das bringt natürlich auch niemandem was. Wenn du hier User-Eingaben anforderst, solltest du sinnvollerweise auch mitteilen, welche Eingaben du da konkret verwendet hast. Dass die Methode mit irgendwelchen zwei Strings aufgerufen werden muss, ist ja wohl klar. Wenn ich jetzt deinen Code ausführe, und als Usereingabe "BCDEFG" verwendet, würde ja kein Fehler kommen.
Immer alle nötigen Informationen liefern, um das Problem nachzustellen.
Oder am besten: Beim Untersuchen eines Problems und Bauen eines MCVE halt keine Usereingaben als Teil des Examples machen, sondern halt fixe hardcoded Werte verwenden, mit denen sich das Problem nachstellen lässt.

Genau das ist der Grund, wenn man z.B. bei seiner Stackoverflow Frage ein Close bekommt mit Grund "Needs Debugging Details".
 
Für die Zukunft: Das bringt natürlich auch niemandem was. Wenn du hier User-Eingaben anforderst, solltest du sinnvollerweise auch mitteilen, welche Eingaben du da konkret verwendet hast. Dass die Methode mit irgendwelchen zwei Strings aufgerufen werden muss, ist ja wohl klar. Wenn ich jetzt deinen Code ausführe, und als Usereingabe "BCDEFG" verwendet, würde ja kein Fehler kommen.
Immer alle nötigen Informationen liefern, um das Problem nachzustellen.
Oder am besten: Beim Untersuchen eines Problems und Bauen eines MCVE halt keine Usereingaben als Teil des Examples machen, sondern halt fixe hardcoded Werte verwenden, mit denen sich das Problem nachstellen lässt.

Genau das ist der Grund, wenn man z.B. bei seiner Stackoverflow Frage ein Close bekommt mit Grund "Needs Debugging Details".
Ich merks mir versprochen! Und danke für den/die Hinweise
 

Zurück
Oben