#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]);
}
}