2015-05-09 2 views
1

Я пытаюсь сделать JSP, который принимает текст из текстовой области, и в зависимости от того, будет ли вы выбирать кодировку или декодирование, будет кодировать текст или декодировать закодированный текст. Закодировать часть работает, но вариант декодирования бросаетИспользование Xor для кодирования и декодирования

org.apache.jasper.JasperException: java.lang.NumberFormatException: Для ввода строки: "".

Вот мой код:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>JSP Page</title> 
</head> 
<body> 
    <h1>Xorcoder</h1> 
    <form method="post"> 
     <label>Key</label><input type="text" name="key" /> 
     <p>Encode<input type="radio" name="option" value="encode" /></p> 
     <p>Decode<input type="radio" name="option" value="decode" /></p> 
     <p><textarea name="txt" style="width:400px;height:200px" > 
      <%String txt = ""; 
       int key; 
       String option = ""; 

       if(request.getParameter("txt") != null) { 
        txt = request.getParameter("txt"); 
       } 

       if(request.getParameter("key") != null) { 
       key = Integer.parseInt(request.getParameter("key")); 
       } 
       else { 
        key = 0; 
       } 

        if(request.getParameter("option") != null) { 
       option = request.getParameter("option"); 
        } 

        char temp; 

        int[] array = new int[(txt.length())]; 

         if(option.equals("encode")) { 
         for(int i = 0; i < array.length; i++) { 
         temp = txt.charAt(i); 
         array[i] = temp^key; 
         } 


         for(int i = 0; i < array.length; i++) 
         out.print(array[i] + " "); 
         } 

         else if(option.equals("decode")){ 
         String[] array2 = txt.split(" "); 
         int temp2; 

         for(int i = 0; i < array2.length; i++) { 
          temp2 = Integer.parseInt(array2[i]); 
          temp2 = temp2^key; 
          out.print((char)temp2);        
         }            
        } 

         %></textarea></p> 
     <p><input type="submit" value="Press" /></p> 
     <p><input type="reset" value="Clear" /></p> 

    </form> 

</body> 
</html> 
+0

И ваш вопрос ...? –

+1

Очевидно ... почему он бросает это исключение и как его исправить. –

ответ

2

Проблема начинается здесь:

for (int i = 0; i < array.length; i++) 
    out.print(array[i] + " "); 
    } 

Это выводит массив с пробелом после каждого номера. Не между каждым числом.

Вы затем разделить эту строку так:

и (удивительно) последний элемент массива собирается быть пустой строкой.

Решение:

  1. не выводите окончательное место в первую очередь.

  2. Обрезать строку перед разбиением

  3. Убедитесь, что строки непустые перед вызовом parseInt.

(Вам не нужно проверять null. Спецификации для split гарантии, что не будет никаких нулей в массиве ...)

+0

Спасибо, добавив, что метод trim() получил все, что работает. – Robert

+0

@ Роберт вы видели мой ответ? у вас много пробелов в текстовом поле из-за того, как вы написали свой код ** html ** –

+0

@Lysenko Andrii Я просто прочитал ваш ответ. Вы правы в html-тегах, которые я немного ржавый. Я еще не выполнял этот оператор if в моем последнем цикле. С помощью обрезки решена проблема. Но я попробую то, что вы предложили. Спасибо, что нашли время для работы над моей проблемой, я действительно ценю это. – Robert

1

java.lang.NumberFormatException говорит вам, что "" не является числом. Проблема заключается в том, что вы используете Integer.parseInt. Перед использованием Integer.parseInt(...) убедитесь, что вход этого элемента не пуст (а не null, проверьте это условие, только если параметр может быть нулевым, в противном случае - не требуется). Если он пуст, Integer.parseInt выбросит эту ошибку.

+0

В этом контексте тестирование для null является избыточным. –

+0

Я согласен, но для принятия мер безопасности и более осведомлены об использовании 'Integer.parseInt' :) – Abhishek

+0

. Вы рекомендуете ** ненужные ** меры безопасности. Это плохо. Вы подразумеваете, что это нормально, чтобы добавить нулевые тесты (и пустые строки), не понимая, что вызывает проблему в первую очередь. Это тоже плохо. –

0

Будем надеяться, что все, что вам нужно сделать, чтобы решить ваши головоломка является добавление если утверждения в последний цикл в коде:

for(int i = 0; i < array2.length; i++) { 
    if (array2[i].isEmpty()) //checks whether the length of string is 0 
     continue; //skips current iteration and moves further 
    temp2 = Integer.parseInt(array2[i]); 
    temp2 = temp2^key; 
    out.print((char)temp2);        
} 

Кроме того, я хотел бы сказать, что не имея никакого пространства между такими метками, как <%, % и другие теги html делают ваш текст более чистым. Я имею в виду, попробуйте использовать

<textarea name="txt" style="width:400px;height:200px" ><% 

Вместо

<textarea name="txt" style="width:400px;height:200px" > 
     <% 

, так что вы не будете иметь никаких бесполезные символы пробела в вашем текстовом поле.

Удачи :)

 Смежные вопросы

  • Нет связанных вопросов^_^