Пропускает ли (COND1 || COND2) проверку COND2, если COND1 истинно?

Я хочу сохранить три верхних значения из какого-либо источника в списке. Упрощенный пример здесь:

import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        List<Integer> top3 = new ArrayList<>();

        while (true) {
            Integer newInt = Integer.valueOf(sc.nextInt());

            for (int i = 0; i < 3 && i <= top3.size(); i++) {
                if (i == top3.size() || newInt.compareTo(top3.get(i)) > 0) {
                    newInt = top3.set(i, newInt);
                }
            }

            System.out.println(top3.toString());
        }
    }
}

Но проблема в том, что программа выдает java.lang.IndexOutOfBoundsException. Так вот вопрос: разве оператор || не должен пропускать проверку условий после достижения первого? Потому что если бы это было так, я бы не получил ошибку.

Обновлено:

Как я указал в своем ответе, проблема заключалась в методе «.set()», поскольку я ожидал, что он добавит List, если метод будет применен к его концу.

См. docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html . Кроме того, из Спецификации языка Java: «Во время выполнения сначала вычисляется выражение левого операнда…. Если результирующее значение равно true, значение условного выражения-или равно true и выражение правого операнда не вычисляется».

VGR 09.06.2024 01:57

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

user207421 09.06.2024 06:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
2
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ответ в том, что (COND1 || COND2) фактически перестает проверять, истинно ли COND1.

Я обнаружил, что исключение выдается методом set(), а не методом get(), что доказывает, что ответ на вопрос - «да».

Проблема в том, что я ожидал, что top3.set(i, newInt) просто добавит top3 с newInt, когда i достигнет top3.size(). Но согласно документации , этот метод просто выбрасывает упомянутое java.lang.IndexOutOfBoundsException, если так.

Я решил проблему так:

import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        List<Integer> top3 = new ArrayList<Integer>();

        while (true) {
            Integer newInt = Integer.valueOf(sc.nextInt());

            for (int i = 0; i < 3; i++) {
                if (i == top3.size()) {
                    top3.add(newInt);
                    break;
                } else if (newInt.compareTo(top3.get(i)) > 0) {
                    newInt = top3.set(i, newInt);
                }
            }

            System.out.println(top3.toString());
        }
    }
}

Другие вопросы по теме