Возврат набора массивов в основной метод с использованием цикла for выдает ошибку deadcode

#java #eclipse

#java #eclipse

Вопрос:

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


Пользовательский ввод уже сохранил данные в следующих переменных; aAlarm, aHour и aMinute.. но, похоже, я не могу заставить их отображаться в основном методе. Я пробовал искать другие проблемы, связанные с мертвой ошибкой, и, похоже, ни одна из них не решает мою проблему. Ниже приведен код, переменная ‘instances’ равна 1 и будет увеличиваться на количество раз, когда пользователь создает сигнал тревоги.

 import java.util.*;

public class Frontend {
    
    public static void main(String args[]) {
        Backend nyet = new Backend();
        Scanner scn = new Scanner(System.in);
        int dec, dec2;
        System.out.print("The time is: ");
        System.out.println(nyet.displayClock());
                        //Class clock----------------------------
        
                        //Class setTime--------------------------
        System.out.print("Do you wish to alter time| 1 = Yes, 0 = No:");
        dec = scn.nextInt();
        if (dec == 1) {
            System.out.print("Input Hour:");
            int hour = scn.nextInt();
            if (hour < 0 || hour > 24) {
                System.out.println("Sorry, there are only 24hrs in one day.");
                System.exit(0);
            }
            System.out.print("Input Minute:");
            int minute = scn.nextInt();
            if (minute < 0 || minute > 60) {
                System.out.println("Sorry, there are only 60mins in one hour.");
                System.exit(0);
            }
            System.out.print("Input Second:");
            int second = scn.nextInt();
            if (second < 0 || second > 60) {
                System.out.println("Sorry, there are only 60second in one minute.");
                System.exit(0);
            }
            nyet.setTime(hour, minute, second); 
            scn.close();
            System.out.print("The time is: ");
            System.out.println(nyet.displayClock());
        }               //Class setTime--------------------------
        
                        //Class setAlarm-------------------------
        System.out.print("Do you wish to set an alarm| 1 = Yes, 0 = No:");
        int dec1 = scn.nextInt();
        if (dec1 == 1) {
            do {
                int instc = 1;
                System.out.print("Input alarm number:");
                int aNum = scn.nextInt();
                System.out.print("Input Hour:");
                int aHr = scn.nextInt();
                if (aHr < 0 || aHr > 24) {
                    System.out.println("Sorry, there are only 24hr in one day.");
                    System.exit(0);
                }
                System.out.print("Input Minute:");
                int aMin = scn.nextInt();
                if (aMin < 0 || aMin > 60) {
                    System.out.println("Sorry, there are only 60mins in one hour.");
                    System.exit(0);
                }
                System.out.print("Do you wish to set another alarm| 1 = Yes, 0 = No:");
                dec2 = scn.nextInt();
                if (dec2 == 1)
                    instc  ;
                nyet.setAlarm(instc, aNum, aHr, aMin);
            }while (dec2 != 0);
        }               //Class setAlarm-------------------------
        
        System.out.print("Show alarm| 1 = Show, 0 = Nothing:");
        int z = scn.nextInt();
        if (z == 1)
            nyet.displayAlarm();
    }
}
  
 import java.time.OffsetTime;

public class Backend {
    
    OffsetTime nyet = OffsetTime.now();
    private int cHour, cMinute, cSecond, instances;
    private int[] aAlarm, aHour, aMinute;
    private boolean[] alarmOn;
    
    public Backend() {
        
        cHour = nyet.getHour();
        cMinute = nyet.getMinute();
        cSecond = nyet.getSecond();

        aHour = new int[2];
        aMinute = new int[2];
        aAlarm = new int[2];
        alarmOn = new boolean[2];

        for (int i = 0; i < 2; i  ) {
            alarmOn[i] = !alarmOn[i];
        }
    }

    public void setAlarm(int instncs,int aNmbr, int aHr, int aMnt) {
        for (int i = 0; i < instncs; i  ) {
            aAlarm[i] = aNmbr;
            aHour[i] = aHr;
            aMinute[i] = aMnt;
            instances = instncs;
        }
    }
    
    public void setTime(int hr, int min, int sec) {
        cHour = hr;
        cMinute = min;
        cSecond = sec;
    }
    
    public String displayClock() {
        return String.format("d:d:d", cHour, cMinute, cSecond);
    }
    
    public String displayAlarm() {
        for (int i = 0; i < instances; i  ) { //<<< Dead Code
            return String.format("d:d:d", aAlarm[i], aHour[i], aMinute[i]);
        }
    }
}
  

Комментарии:

1. Помогите нам помочь вам — поделитесь некоторыми образцами данных и результатом, который вы хотели бы получить за это

2. Ваш for цикл не имеет смысла. Когда instances значение больше нуля, оно входит в тело цикла и немедленно возвращается с результатом String::format . Если вы хотите что-то напечатать, используйте System.out::println или объедините подстроку каждой итерации в одну строку и верните ее.

3. На первой итерации, i = 0 и instances = 1 , действительно. Он входит в тело цикла и встречает return ключевое слово. Вычисляется выражение за return ключевым словом (результат String::format ) , а затем оно немедленно возвращается из метода . Второй итерации нет.

4. Кстати, я не знаю, как Eclipse обрабатывает это, но мой компилятор жалуется на то, что в displayAlarm() методе отсутствует оператор возврата . Это не означает, что нет оператора return, но это означает, что не все пути кода имеют его. В вашем случае, если instances есть 0 , он полностью пропускает тело цикла, а затем метод завершается без инструкции return.

5. Ну, для начала, опубликуйте свой весь код. Вы еще не показали, где и как instances устанавливается.

Ответ №1:

Когда я ввел код для вашего класса Backend в моем Eclipse, он показал ошибку сборки для метода displayAlarm() , а именно…

Этот метод должен возвращать результат типа String

Вот код для метода displayAlarm() (точно такой, как он указан в вашем вопросе).

 public String displayAlarm() {
    for (int i = 0; i < instances; i  ) { //<<< Dead Code
        return String.format("d:d:d", aAlarm[i], aHour[i], aMinute[i]);
    }
}
  

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

 public String displayAlarm() {
    for (int i = 0; i < instances; i  ) { //<<< Dead Code
        return String.format("d:d:d", aAlarm[i], aHour[i], aMinute[i]);
    }
    return "";
}
  

После добавления строки я получил предупреждение о мертвом коде. Я признаю, что мне потребовалось некоторое время, чтобы выяснить причину. Наконец-то меня осенило. Единственное, что в for теле цикла return . Следовательно, когда-либо будет только одна итерация цикла, так зачем увеличивать i ?

Ответ №2:

Думаю, проблема заключалась в том, что в классе не было ‘static’.

Внешний код:

 public static void main(String args[]) {
        int dec, dec2, amount = 0, deci0;
        Backend nyet = new Backend();
        Scanner scn = new Scanner(System.in);
  
 System.out.print("Do you wish to set an alarm| 1 = Yes, 0 = No:");
        int dec1 = scn.nextInt();
        if (dec1 == 1) {
            do {
                System.out.print("Input alarm number(Stored = "   amount   "):");
                int aNum = scn.nextInt();
                System.out.print("Input Hour:");
                int aHr = scn.nextInt();
                if (aHr < 0 || aHr > 24) {
                    System.out.println("Sorry, there are only 24hr in one day.");
                    System.exit(0);
                }
                System.out.print("Input Minute:");
                int aMin = scn.nextInt();
                if (aMin < 0 || aMin > 60) {
                    System.out.println("Sorry, there are only 60mins in one hour.");
                    System.exit(0);
                }
                nyet.setAlarm(amount, aNum, aHr, aMin);
                System.out.print("Do you wish to set another alarm(max 3)| 1 = Yes, 0 = No:");
                dec2 = scn.nextInt();
                if (dec2 == 1) {
                    amount  ;
                }else if (dec2 == 0) {
                    amount  ;
                    nyet.setAlarm(amount, aNum, aHr, aMin);
                }else {
                    System.out.println("The only choices are '1' and '0'.");
                    System.exit(0);
                }
                if (amount > 3) {
                    System.out.println("You have reached maximum storage.");
                    dec2 = 0;
                }
            }while (dec2 != 0);
        }
  

Внутренний код:

 public class Backend {
    
    OffsetTime nyet = OffsetTime.now();
    private int cHour, cMinute, cSecond;
    private static int[] aAlarm, aHour, aMinute;
    private boolean[] alarmOn;
    private static int amnt;
  
 public void setAlarm(int instncs,int aNmbr, int aHr, int aMnt) {
        int i = instncs;
        aAlarm[i] = aNmbr;
        aHour[i] = aHr;
        aMinute[i] = aMnt;
        amnt = instncs;
    }


public static void displayAlarm() {
        for (int i = 0; i < amnt; i  ) {
            System.out.println("Alarm #"   aAlarm[i]   " - "   aHour[i]   ":"   aMinute[i]);
        }
    }