"Я не могу правильно отловить NumberFormatException, из-за этого мой onClick не работает - PullRequest
0 голосов
/ 29 июня 2019

Я пытался создать простое приложение, которое будет принимать простой текст без строк и преобразовывать обычный текст в зашифрованный текст, используя технику шифрования с помощью ограждения.Я не брал ни одной строки ввода от пользователя и преобразовал эту строку в целое число путем приведения.Как я это делал, он показывает NumberFormatException.Я написал строку приведения внутри блока try и там после того, как область действия этой переменной ограничена, так что мой метод encryption() не может получить к ней доступ.Что я могу сделать, так как моя функция onClick не производит правильный желаемый зашифрованный текст?Кнопка ведет себя так, как будто ее никогда не нажимали.

Я попытался создать эту переменную вне блока try и затем типизировать ее внутри блока, я также сделал эту переменную lines final при обращении к нейв классе.Затем он попросил меня инициализировать переменную, я тоже это сделал, но, похоже, это мне не помогает.

Button decryptBtn, encryptBtn;
TextView hlWrld, encryptedText;
EditText noOfLines, plainText;
int lines;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    decryptBtn = findViewById(R.id.decryptBtn);
    encryptBtn = findViewById(R.id.encrptBtn);
    hlWrld = findViewById(R.id.hlwWorld);
    encryptedText = findViewById(R.id.encryptedText);
    noOfLines = findViewById(R.id.lineNo);
    plainText = findViewById(R.id.plntxt);

    final String plntxt = plainText.getText().toString();
    final String noOflines = noOfLines.getText().toString();
    int lines = 0;
    try {
        lines = Integer.parseInt(noOflines);
    } catch (NumberFormatException e) {

    }

    final int finalLines = lines;

    encryptBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            encryption(plntxt, finalLines);
        }
    });
}

public void encryption(String plntxt, int lines) {
    boolean checkdown = false;  // check whether it is moving downward or upward
    int j = 0;
    int row = lines;                  // no of row is the no of rails entered by user
    int col = plntxt.length();             //column length is the size of string
    char[][] a = new char[row][col];
    // we create a matrix of a of row *col size

    for (int i = 0; i < col; i++) {  // matrix visiting in rails order and putting the character of plaintext
        if (j == 0 || j == row - 1)
            checkdown = !checkdown;

        a[j][i] = plntxt.charAt(i);

        if (checkdown) {
            j++;
        } else {
            j--;
        }
    }

    // visiting the matrix in usual order to get ciphertext
    for (int i = 0; i < row; i++) {
        for (int k = 0; k < col; k++) {
            System.out.print(a[i][k] + "  ");
        }
        System.out.println();
    }

    String en = "";

    System.out.println("----------------------");
    for (int i = 0; i < row; i++) {
        for (int k = 0; k < col; k++) {
            if (a[i][k] != 0)
                en = en + a[i][k];
        }
    }

    System.out.println(en); // printing the ciphertext
    encryptedText.setText(en);
}

Я ожидаю, что результатом будет зашифрованный текст, полученный в результате setText()метод, который я применил к моему textView.Но ничего не происходит вообще.

1 Ответ

0 голосов
/ 29 июня 2019

Я не брал ни одной строки, введенной пользователем, и преобразовал эту строку в целое число путем приведения.Как я это делал, он показывает NumberFormatException.

Это потому, что вы пытаетесь прочитать строку из EditText без ввода еще как целое число, которое не является допустимым числом с помощью следующего кода (см. комментарий):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // your view binding code with findViewById
    // ...

    // here you're trying to read the EditText value,
    // but no user input yet because you've only inflate it before.
    final String plntxt= plainText.getText().toString();
    final String noOflines= noOfLines.getText().toString();
    // the noOfLines is "", an empty string.
    int lines = 0;
    try {
        // this raise an exception because empty string is not number.
        lines = Integer.parseInt(noOflines);
    }
    catch (NumberFormatException e){

    }

    ...
}

Я попытался создать эту переменную вне блока try, а затем типизировать ее внутри блока, я также сделал эту переменную "lines" final, когда к ней обращались вучебный класс.затем он просит меня инициализировать переменную, я тоже это сделал, но, похоже, это мне не помогает.

То, что вы сделали, - это нанесло больший урон вашему коду, потому что вы сделали значение переменной постоянным.Оба значения plntxt и noOflines всегда будут "", пустой строкой.Итак, ваш следующий код не будет работать:

final String plntxt= plainText.getText().toString();
final String noOflines= noOfLines.getText().toString();

...

final int finalLines = lines;
encryptBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // this won't work because plntxt is always empty string
        // and finalLines is always invalid number.
        encryption(plntxt, finalLines);
    }
});

Простое исправление можно сделать, переместив весь получатель текста внутрь вашего onClick метода:

encryptBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
      String plntxt= plainText.getText().toString();
      String noOflines= noOfLines.getText().toString();
      int lines = 0;
      try {
        lines = Integer.parseInt(noOflines);
      }
       catch (NumberFormatException e){

      }

      encryption(plntxt, finalLines);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...