-4

ユーザーから受信したメッセージをエンコードするJavaプログラムを作成しています。これを行う方法の背景として、入力を取得し、それを文字に分割してから、メッセージの長さに等しい乱数のセットをRandom.org(真の乱数ジェネレーター)から取得してからシフトすることになっています。対応するシフトまたは乱数による入力の文字は、コード化されたメッセージとシフトを出力します。これまでのところ、入力を取得し、それを文字列配列に変換し、クォータを確認し(Random.orgにはクォータがあります)、乱数を取得しました。変換されたシフト(Webサイトで取得した文字列からintに)を出力しようとすると、このエラーが発生します。これは、最後の数値のCRLFが原因だと思います(これを修正するために正規表現を使用しようとしましたが、修正されませんでした仕事)。これが私のコードです:

public class Encryption_System {static String originalMessege;

public static void main(String[] args) throws Exception {
    System.out.println("Welcome to the encryption system!");
    System.out.println("Type your messege below:");
    System.out.println("\nHere is your original messege: " + scan() + "\n");
    Encrypt code = new Encrypt();
    code.Messege(originalMessege);
    code.encryptMessege();

}

private static String scan() {
    Scanner scan = new Scanner(System.in);
    originalMessege = scan.nextLine();
    return originalMessege;
}

}

次に、私の問題が発生する2番目のクラスがあります。私のエラーは最後の方法から来ています(私の試みた正規表現修正はコメントアウトされています):

public class Encrypt {
    private String messege;
    private String[] characters;
    private URL quotaURL;
    private URLConnection conect;
    private InputStream quotaInput;
    private BufferedReader quotaReader;
    private int quota;
    private boolean go;
    private URL shiftsURL;
    private URLConnection conectShifts;
    private InputStream shiftsInput;
    private BufferedReader shiftsReader;
    private int count;
    private char[] shifts;
    private int[] shiftsInt;
    private String shiftsString;
    private String[] shiftsStrings;

    public void Messege(String x) {
        messege = x;
    }

    private String[] getCharacters() {
        characters = messege.split("(?!^)");
        return characters;
    }

    private boolean checkQuota() throws Exception {
        quotaURL = new URL("http://www.random.org/quota/?format=plain");
        conect = quotaURL.openConnection();
        quotaInput = conect.getInputStream();
        quotaReader = new BufferedReader(new InputStreamReader(quotaInput));
        int quota = Integer.parseInt(quotaReader.readLine());
        if (quota >= getCharacters().length)
            go = true;
        else
            go = false;
        return go;
    }

    private char[] Shifts(String[] x1) throws Exception {
        String[] messegeArray = x1;
        count = 0;
        for (int k = 0; k < x1.length; k++) {
            if (x1[k].equals(" ")) {
                continue;
            } else {
                count++;
            }
        }
        shifts = new char[count * 3];
        if (checkQuota() == true) {
            shiftsURL = new URL("http://www.random.org/integers/?num=" + count
                    + "&min=1&max=27&col=" + count
                    + "&base=10&format=plain&rnd=new");
            conectShifts = shiftsURL.openConnection();
            shiftsInput = conectShifts.getInputStream();
            shiftsReader = new BufferedReader(
                    new InputStreamReader(shiftsInput));
            shiftsReader.read(shifts, 0, count * 3);
        }

        return shifts;
    }

    public void encryptMessege() throws Exception {
        char[] currentShifts = Shifts(getCharacters());
        shiftsString = new String(currentShifts);
        //  shiftsString.replace("[\t\r\n]", "");
        shiftsStrings = shiftsString.split("[(  )]");
        shiftsInt = new int[shiftsStrings.length];
        System.out.println("These are your shifts");
        for (int v = 0; v < shiftsInt.length; v++) {
            shiftsInt[v] = Integer.parseInt(shiftsStrings[v]);
            System.out.println(shiftsInt[v] + " ");
        }
    }
}

そしてここに私の出力があります:

Welcome to the encryption system!
Type your messege below:
Hello

Here is your original messege: Hello

These are your shifts
3 
19 
12 
3 
Exception in thread "main" java.lang.NumberFormatException: For input string: "12

Process completed.

私はJavaの初心者(高校1年生の計算機科学)なので、助けてくれてありがとう!

4

3 に答える 3

0

あなたのコードは私にとって失敗しています:

shiftsStrings = shiftsString.split("[(  )]");

値を適切に分割していません。

編集:

これを試して:

public void encryptMessege() throws Exception {
    List<Integer> shifts = new ArrayList<Integer>();
    StringTokenizer st = new StringTokenizer(new String(Shifts(getCharacters())));
    while(st.hasMoreTokens())
    {
        String token =st.nextToken();
        try{
            shifts.add(Integer.parseInt(token));
        }catch(NumberFormatException e)
        {
            System.out.println("did not parse: " + token);
        }
    }

    System.out.println("These are your shifts: " + shifts.toString());
}

コード内で取り組むべきことがたくさんあることに注意してください。

1) メソッド内に機能をカプセル化する。すべての変数をクラス レベルの属性として保持すると、混乱します。パラメータを使用してメソッド間でそれらを渡すと、コードが読みやすくなり、コードの一部をテストしやすくなります。

2) メソッド名は小文字で始める必要があります。これは一般的な Java コーディングの慣行です。

于 2013-03-12T22:53:02.077 に答える
0

問題はここから発生しているようです:

shiftsInt[v]= Integer.parseInt(shiftsStrings[v]);

そして、これは for ループで の値にv達すると失敗します4。for ループから式を削除し、 のすべての文字列shiftsStrings 実際に に解析できるかどうかを確認しintます。これを実行してみてください:

for(int v = 0; v < shiftsStrings.length; v++ ) {
    System.out.println(shiftsStrings[v]);
}

出力に予期しないものがある場合、次のステップは、その値が配列内でどのようにその位置を見つけたかを調べること (および場合によっては削除すること) です。

于 2013-03-12T22:37:52.730 に答える
0

最後の数字の数字以外の文字が原因であると思われる場合は、それを parseInt に入れる前に、数字以外の文字に置き換えます ( なども使用できます\r) \n

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#replace(char , char)

トリムはもう 1 つの便利な方法で、先頭と末尾の空白をすべて削除します。

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#trim()

于 2013-03-12T22:38:12.987 に答える