отсутствует оператор возврата без выброса нового IllegalArgumentException - PullRequest
1 голос
/ 25 июня 2019

Я смотрю на двухсимвольный код leetcode и запутался в том, чтобы бросить новый оператор IllegalArgumentException. Цель кода - вернуть индексы двух чисел так, чтобы они суммировались с определенной целью, учитывая массив целых чисел. Предполагается, что каждый вход будет иметь ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Вот код:

если я запускаю этот код без броска new IllegalArgumentException("No two sum solution"), отображается сообщение об ошибке:

Строка 10: ошибка: отсутствует оператор возврата } ^

Но если я добавлю throw new IllegalArgumentException("No two sum solution"), код будет работать гладко.

Мой вопрос заключается в том, что, поскольку предполагается, что для каждого входа есть только одно решение, почему в этом случае имеет значение бросок нового исключения IllegalArgumentException. Спасибо.

class Solution {
    public int[] twoSum(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums [j] == target) {
                    return new int[] {i, j};
                }
            }
        }
        throw new IllegalArgumentException("No two sum solution");
    }
}

Ответы [ 2 ]

3 голосов
/ 25 июня 2019

Компилятор не может узнать ваше предположение о том, что существует только одно решение.

Правила, касающиеся доступности операторов, на самом деле довольно просты.В частности, поскольку присутствует защита цикла во внешнем цикле, а не постоянное выражение со значением true, компилятор считает, что тело цикла никогда не может быть выполнено.Таким образом, вам необходимо обработать эту возможность.

Поскольку метод не является пустым, вы должны либо вернуть значение, либо выдать исключение.

1 голос
/ 25 июня 2019

Добро пожаловать в ТАК!

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

Поскольку вы объявили, что возвращаете целочисленный массив, каждый путь должен приводить к концу, где оператор return возвращает этот объявленный тип.

Так как вы можете получить доход только внутри вашего if, если внутри вашего for for your for, компилятор может легко найти способ обойти это:

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

не будет введено, если num.length == 0. Так как вы не проверяете это, даже умный компилятор должен ожидать пустой массив как допустимый ввод (даже нулевой допустимый - и вылетит ваша функция)

for (int j = i + 1; j < nums.length; j++) {

снова, требуется num.length > j. Поскольку num.length==1 является допустимым вводом, вы не будете вводить его для цикла.

if (nums[i] + nums [j] == target) {

Последнее препятствие для вашего оператора return полностью зависит от содержимого вашего массива и значения target. Поскольку эти значения известны только во время выполнения, и компилятор немного имитирует вещи, которые он не знает заранее, он будет ожидать, что вы предоставите много входных данных, которые не выполнят это условие, поэтому возвращение никогда не будет достигнуто.

Итак, компилятор может легко увидеть, что существуют пути кода, которые не имеют правильного оператора возврата. Бросок исключения является альтернативным завершающим оператором и, таким образом, делает ваш компилятор счастливым.

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