Обработка исключений не вызвана / неожиданное поведение в программе - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть Java-программа, которая принимает аргументы командной строки, а затем преобразует десятичное значение в его шестнадцатеричный аналог. Я пытаюсь использовать блок кода обработки исключений (try / catch), который не запускается. Блок try / catch предназначен для запуска, когда в программу не передаются аргументы командной строки.

Выполнение программы через Jenkins / SonarQube для выявления запахов кода и устранения проблем. Использовали процесс проб и ошибок, чтобы поэкспериментировать с различными возможностями, чтобы увидеть, смогу ли я устранить недостатки дизайна.

https://pastebin.com/frBq46zs

//import java.util.Scanner;
public class Dec2Hex
{
public static int Arg1;

public static void main(String args[])
{
Scanner scan = new Scanner(System.in);
System.out.println("Enter any number: ");
//Arg1= scan.nextInt();
//scan.close();
if (args.length < 0)
{
try
{
Arg1 = Integer.parseInt(args[0]);
}
catch (NumberFormatException e)
{
System.err.println("Argument" + args[0] + " must be an integer.");
System.exit(1);
}
}

Использование, если (args.length > 0) без значения командной строки приводит к тому, что исключение не вызывается. Я подумал, что этого следовало ожидать, потому что блок исключений никогда не сработал бы, потому что условный оператор не был выполнен.

Однако обратное утверждение оказалось не таким, как ожидалось. Я подумал, что если (args.length==0), то это будет означать, что «никакие аргументы не были переданы, попытка проанализировать введенное значение в командной строке. Если все же, несмотря на это, никакое значение не может быть проанализировано, ТО запускается оператор catch, генерирующий сообщение об ошибке». и выведите его пользователю. "

Всякий раз, когда я использую args.length==0 или args.length<0 без аргументов командной строки, все, что я получаю, это:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0

Сообщение, которое конкретно ссылаетсяна следующую строку кода:

Arg1 = Integer.parseInt(args[0]);

1 Ответ

0 голосов
/ 07 ноября 2019

В вашем коде Arg1 = Integer.parseInt(args[0]); до вызова метода Integer.parseInt аргументы метода будут разрешены. Поэтому он попытается получить первый элемент из списка аргументов (так как массив Java основан на 0, он получит первый элемент с индексом 0).

Поскольку вы не передаете ни одного аргумента командной строки, код нарушается во время разрешения аргумента,Поскольку длина массива равна 0, args[0] дает ArrayIndexOutOfBoundsException. Какой ожидаемый сценарий. Таким образом, вы должны также рассмотреть это исключение.

try
{
Arg1 = Integer.parseInt(args[0]);
}
catch (ArrayIndexOutOfBoundsException e)
{
System.err.println("No Argument Provided.");
System.exit(1);
}
catch (NumberFormatException e)
{
System.err.println("Argument" + args[0] + " must be an integer.");
System.exit(1);
}

И вам это не нужно, если условие проверки длины аргумента, если вы хотите выполнить код исключения для длины 0. Если вы хотите выполнить существующий аргумент блока исключения, который не является числом, и удалите условие if.

В итоге, код будет достигать блока NumberFormatException, когда вы передадите какой-либо аргумент, а это не число. И это исключение будет выброшено Integer.parseInt. И текущее исключение выдается args[0], потому что длина массива равна 0, и вы пытаетесь извлечь первый элемент массива из пустого массива, и он выдает ArrayIndexOutOfBoundsException.

Хотя это не такжелательно достичь кода исключения, в то время как вы можете справиться с этим еще до этого.

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