2016-12-08 12 views
-3

私は、テキストを暗号化および復号化できるプログラムを作成しています。現在、暗号化の重複/エラーを避けるために、私の暗号化と復号プロセスはケーススイッチで行われます。あたかもこれが働いているかのように感じます。基本的に、暗号化は次のように動作します。FORループは文字列入力のすべての文字を読み取り、それをCASE SWITCHに変えて特定の文字列に置き換えます。私は、次のエラーメッセージを取得しています:ここでJava暗号化: "java.lang.OutOfMemoryError:Java heap space"

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.util.Arrays.copyOf(Arrays.java:3332) 
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124) 
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:541) 
    at java.lang.StringBuffer.append(StringBuffer.java:350) 
    at java.util.regex.Matcher.appendReplacement(Matcher.java:888) 
    at java.util.regex.Matcher.replaceAll(Matcher.java:955) 
    at java.lang.String.replaceAll(String.java:2223) 
    at OR_v5_12_5_16.main(OR_v5_12_5_16.java:161) 

----jGRASP wedge2: exit code for process is 1. 
----jGRASP: operation complete. 

は、コードブロックを少し変更し、短縮バージョンです。実際のコードブロックは、すべて26の大文字と26のすべての小文字で実行されます。エラーメッセージの前に、プログラムが停止しているように見えます。

for (int i = 0; i < txt.length(); i++){ 

    String txt_char = String.valueOf(txt.charAt(i)); 

     switch (txt_char){ 

      case "A": 

       txt = txt.replaceFirst("A", "11110000"); 
       break; 
     } 
} 
+0

[mcve]としてコードを投稿すると、手助けをすることができます。現状のまま、効果的な支援はできません。 – AJNeufeld

+0

コードとログをコピーして貼り付けてください。これらの場合は画像を使用しないでください。 – sanastasiadis

+0

@AJNeufeld今のところ提供されました – PeculiarTendencies

答えて

-1

あなたの暗号化コードは、はるかに効率的、によって行うことができます。

  • 結果
  • 文字列に戻って、単一の文字を変換しない

のために必要なメモリを事前に割り当て例:

StringBuilder result = new StringBuilder(txt.length() * 8); 

int len = txt.length(); 
for (int i = 0; i < len; i++) { 
    char ch = txt.charAt(i); 

    switch (ch) { 
     case 'A': result.append("11110000"); break; 
     case 'B': result.append("10101010"); break; 
     // ... etc ... 
    } 
} 

txt = result.toString(); 

暗号化中に元のStringを変更しないことで、すでに暗号化されたデータを再暗号化する機会もなくなります。

+0

ありがとう!私はそれを試してみてください!ご協力ありがとうございました! – PeculiarTendencies

関連する問題