2016-04-25 13 views
0
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.IOException; 

/** 
    This class encrypts files using the Caesar cipher. 
    For decryption, use an encryptor whose key is the 
    negative of the encryption key. 
*/ 
public class CaesarCipher 
{ 
    private String keyWordString; 
    private String removeDuplicates(String word){ 

    for (int i = 0; i < word.length(); i++) { 
     if(!keyWordString.contains(String.valueOf(word.charAt(i)))) { 
      keyWordString += String.valueOf(word.charAt(i)); 
     } 
    } 
    return(keyWordString); 
} 

    /** 
     Constructs a cipher object with a given key word. 
     @param aKey the encryption key 
    */ 
    public CaesarCipher(String aKeyWord) 
    { 
     keyWordString = removeDuplicates(keyWordString); 
     keyWordString = aKeyWord; 
     //create the mapping string 
     //keyWordString = removeDuplicates(keyWordString); 
     int moreChar = 26 - keyWordString.length(); 
     char ch = 'Z'; 
     for(int j=0; j<moreChar; j++) 
     { 
     keyWordString += ch; 
     ch -= 1; 
     } 
     System.out.println("The mapping string is: " + keyWordString); 
    } 

    /** 
     Encrypts the contents of a stream. 
     @param in the input stream 
     @param out the output stream 
    */  
    public void encryptStream(InputStream in, OutputStream out) 
     throws IOException 
    { 
     boolean done = false; 
     while (!done) 
     { 
     int next = in.read(); 
     if (next == -1) 
     { 
      done = true; 
     } 
     else 
     { 
      //int encrypted = encrypt(next); 
      int encrypted = encryptWordKey(next); 
      System.out.println((char)next + " is encrypted to " + (char)encrypted); 
      out.write(encrypted); 
     } 
     } 
    } 

    /** 
     Encrypts a value. 
     @param b the value to encrypt (between 0 and 255) 
     @return the encrypted value 
    */ 
    public int encryptWordKey(int b) 
    { 
     int pos = b % 65; 
     return keyWordString.charAt(pos); 
    } 
} 

Wenn ich werde diesen Code ausführen es gibt mir ein Fehler Laufzeit, der sagt:So entfernen Sie doppelte Buchstaben aus einer Zeichenfolge? Caesar Cipher

Exception in thread "main" java.lang.NullPointerException 
    at CaesarCipher.removeDuplicates(CaesarCipher.java:15) 
    at CaesarCipher.<init>(CaesarCipher.java:29) 
    at CaesarEncryptor.main(CaesarEncryptor.java:29) 

Sagen wir, ich geben JJJJJJJavvvvvaaaaaaa und ich möchte es Java erhalten und geben Sie mir den verschlüsselten Code . Um von der anderen Frage, die bereits gestellt wurde, zu unterscheiden, brauche ich die removeDuplicates-Methode, die ausgeführt wird und die Ausgabe hat, um JavaZYWW ..... etc auszudrucken. Irgendwelche Hilfe oder Vorschläge? I help würde sehr geschätzt werden

+1

Hinweis: Dieser Code ist ** perfekt ** für TDD und JUnit/Unittests. Sie möchten zuerst Testfälle schreiben, die genau angeben, was Sie erwarten, dass eine Methode "ausgegeben" wird; und dann schreiben Sie den Produktionscode, um diesen Testfall zu "implementieren". Damit können Sie sofort erkennen, wenn ein Code nicht wie erwartet funktioniert. und Sie sind nur einen Klick davon entfernt, einen Debugger für den fehlerhaften Testfall auszuführen. – GhostCat

+0

Oh, ich habe es nicht bemerkt. Aber die Ausgabe sollte JavaZYXW ...... usw. sein, wenn es fertig ist. Ich habe versucht, den Debugger mit einer anderen Platzierung der removeDuplicates-Methode zu verwenden, aber es wurde übersprungen und nicht ausgeführt. – user3416645

Antwort

0

Sie vergessen, Ihre Variable keyWordString zu initiieren.

Tun Sie es zum Beispiel im statischen Feld Ihrer Klasse (oder im Konstruktor).

private String keyWordString=""; 
+0

Er macht es im Konstruktor – alpert

+1

Nein, der Konstruktor ruft 'keyWordString = removeDuplicates (keyWordString);' aber die Methode 'removeDuplicates' verwendet die Variable. –

+0

Ich habe versucht, dass der Code erfolgreich kompiliert, aber die Methode removeDuplicates nicht ausgeführt. – user3416645

Verwandte Themen