Могу ли я дать условие для логического примитива в качестве инициализации? - PullRequest
0 голосов
/ 15 ноября 2018

Я не уверен, что это возможно, потому что я не нашел точного ответа, но NetBeans не выдает ошибку.Но если это возможно, почему мой код не работает?

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

    int[][] fiveMatrix = {
        {1, 4, 7, 5, 3}, {3, 7, 9, 10, 1}, {4, -3, 2, -4, 1}, {5, 9, 6, 4, 3}, {1, 2, 3, 4, 5},};

    System.out.print("Which line do you want to write out (0-4)? ");
    int lineNumber = scan.nextInt();
    boolean goodLine = lineNumber < 0 || lineNumber > 4;
    if (goodLine) {
        while (goodLine) {
            System.out.println("Bad index.");
            System.out.print("Which line do you want to write out (0-4)? ");
            lineNumber = scan.nextInt();
        }
    }
}

}

Ответы [ 4 ]

0 голосов
/ 15 ноября 2018

Упрощенный код и простой для понимания

import java.util.Scanner;

public class Post3 {

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

        int[][] fiveMatrix = {
            {1, 4, 7, 5, 3}, {3, 7, 9, 10, 1}, {4, -3, 2, -4, 1}, {5, 9, 6, 4, 3}, {1, 2, 3, 4, 5},};

        System.out.println("Which line do you want to write out (0-4)? ");
        int input = -1;
        while(true) {
            System.out.println("input valid number between 0 to 4");
            input = scan.nextInt();
            if(input >= 0 && input <= 4) {
                break;
            }
        }
        System.out.println("input is "+input);
        scan.close();

    }

}
0 голосов
/ 15 ноября 2018

Возможно, вы хотите обновить логическое значение внутри цикла, чтобы избежать бесконечного цикла.

boolean badLine = lineNumber < 0 || lineNumber > 4;
while (badLine) {
    System.out.println("Bad index.");
    System.out.print("Which line do you want to write out (0-4)? ");
    lineNumber = scan.nextInt();
    badLine = lineNumber < 0 || lineNumber > 4;
}

Я переименовал boolean, так как его первоначальное название сбивало с толку. Я также исключил условие if, так как оно избыточно.

0 голосов
/ 15 ноября 2018

Вам не хватает строки внутри цикла while

boolean goodLine = lineNumber < 0 || lineNumber > 4;

Рассмотрим рефакторинг метода, чтобы избежать дублирования кода:

public boolean goodLine(Scanner scan) {
    System.out.print("Which line do you want to write out (0-4)? ");
    int lineNumber = scan.nextInt();
    return lineNumber < 0 || lineNumber > 4;
}

И назовите это:

while(goodLine());

Можно также назвать это badLine, потому что пользовательский ввод неправильный (не 0-4 значения)

0 голосов
/ 15 ноября 2018

Это здесь:

boolean goodLine = lineNumber < 0 || lineNumber > 4;

оценивается один раз , и результат присваивается этой переменной.

Позже изменяется на lineNumber = scan.nextInt(); do не изменить эту логическую переменную!

«Правильное» решение: вы должны пересчитать логическое свойство.Но в идеале не путем копирования кода, а путем создания небольшого вспомогательного метода:

boolean isGoodLine(int lineNumber) { return lineNumber < 0 || lineNumber > 4; }

И теперь, вместо наличия логической переменной в другом коде, вы просто вызываете этот метод всякий раз, когда изменяется lineNumber!

...