2016-03-21 9 views
0

Ich hatte einige Probleme mit dieser ursprünglich, aber fand eine andere Hilfe hier. Jetzt scheint ich ein Problem mit einem Eingabefehler zu haben. Ich glaube, ich habe die korrekte Formatierung für die Eingabe.Caesar Shift Cipher, Eingabe Ausnahme Fehler

import java.util.Scanner; 
public class CaesarShift 
{ 
//initialize private string for the alphabet 
private final String ALPHABET = "abcdefghijklmnopqrstuvwxyz"; 
//public encryption code 
public String encryptionMethod(String normText, int caesarShift) 
{ 
    normText = normText.toLowerCase(); 
    String cipherText = ""; 
    for (int a = 0; a < normText.length(); a++) 
    { 
     int charP = ALPHABET.indexOf(normText.charAt(a)); 
     int shiftValue = (caesarShift + charP) % 26; 
     char replaceValue = this.ALPHABET.charAt(shiftValue); 
     cipherText += replaceValue; 
    } 
    return cipherText; 
} 
public String decryptionMethod(String cipherText,int caesarShift) 
{ 
    cipherText = cipherText.toLowerCase(); 
    String normText = ""; 
    for (int a = 0; a < cipherText.length(); a++) 
    { 
     int charP = this.ALPHABET.indexOf(cipherText.charAt(a)); 
     int keyValue = (charP - caesarShift) % 26; 
     if(keyValue < 0) 
     { 
      keyValue = this.ALPHABET.length() + keyValue; 
     } 
     char replaceValue = this.ALPHABET.charAt(keyValue); 
     normText += replaceValue; 
    } 
    return normText; 
} 

}

Dann habe ich die Tester Methode es, wo ich die aktuelle Ausgabe des Eingangsausnahmefehler habe

import java.util.Scanner; 
public class CaesarShiftTester 
{ 
public static void main(String args[]) 
{ 
    //import of the scanner method to ask the user for the input they would like 
    Scanner in = new Scanner(System.in); 
    System.out.println("What is the text you would like to do something with?"); 
    String normText = in.next(); 
    System.out.println("What is the Caesar Shift Value?"); 
    int caesarShift = in.nextInt(); 
    //new declaration of the CaesarShift class to report back to easily 
    CaesarShift shift = new CaesarShift(); 
    //decalre the need properties for the encryption 
    String cipherText = shift.encryptionMethod(normText, caesarShift); 
    System.out.println("Your normal text is: " + normText); 
    System.out.println("Your text after encryption is: " + cipherText); 
    String cnormText = shift.decryptionMethod(cipherText, caesarShift); 
    System.out.println("Your encrypted text is: " + cipherText); 
    System.out.println("Your decrypte text is: " + cnormText); 
    } 
} 

Sorry für die etwas chaotisch Code, ich normalerweise aufzuräumen wenn ein Programm fertig ist und funktioniert.

+3

Willkommen bei Stack-Überlauf. Es ist eine gute Idee, den Code vor dem Posten einer Frage aufzuräumen, idealerweise auf einen [mcve] zu reduzieren. Im Moment wissen wir, dass es einen "Ausnahmefehler bei der Eingabe" gibt, aber nicht wo oder was die Nachricht ist, etc. Ich würde Sie dringend bitten, den Code auf ein minimales Beispiel zu reduzieren, den Fehler in die Frage aufzunehmen und was Sie versucht haben, um es zu diagnostizieren. Sie können feststellen, dass Sie dabei das Problem lösen ... –

Antwort

1

Ihr Programm sollte OK funktionieren, wenn Sie nur 1 Wort eingeben. Wenn Sie Leerzeichen einfügen, wird eine Ausnahme angezeigt. Das Problem ist auf der Leitung

String normText = in.next(); 

Es sollte

seine
String normText = in.nextLine(); 

text die ganze Zeile als Eingabe zu erhalten. next() funktioniert nicht wie erwartet, weil

A Scanner bricht seine Eingabe in Token ein Trennzeichen-Muster verwenden, standardmäßig die Leerzeichen entspricht.

So abgestimmt es nur das erste Wort und versuchte, das nächste Wort als int (wegen Ihrer nächsten Zeile int caesarShift = in.nextInt();)

Einige andere Punkte zu analysieren:

  • in Ihre Verschlüsselung/Entschlüsselung Methoden sollten Sie überprüfen, ob die Eingabe char ein Buchstabe ist (zB Character.isLetter()) und nur diese Zeichen verschieben (derzeit findet es keinen Platz in ALPHABET, also indexOf gibt -1 zurück)
  • mit StringBuilder wenn Strings in einer Schleife verketten, ist es schneller
+0

Danke! Die in.nextLine hat perfekt funktioniert –