Я пытался реализовать вариант, когда моя программа начинает либо заходить на сторону администратора, либо на сторону магазина. Когда я добавил использование переключателя и регистра в начале моей программы, это сработало сразу, но я не знаю, почему. Когда я ввожу вариант 2, чтобы перейти на витрину магазина, он входит, и я подумал, что мне нужно будет создать метод, чтобы он мог войти на витрину магазина.
Может кто-нибудь объяснить, что именно происходит в начале моего кода? Думаю, мне просто повезло.
public static void main(String[] args) throws IOException {
while (true) {
System.out.println("Login to Admin site (1) or go to store front (2)?");
int choice = scnr.nextInt();
switch (choice) {
case 1:
StoreFront server = new StoreFront(0);
server.start(6666);
case 2:
}
inventoryManager.initializeInventoryFromFile("inventory.json");
System.out.println("Welcome to the Game Store \n");
System.out.println("Please select an option from the menu");
System.out.println("***************************************");
System.out.println("************MAIN MENU ******************\n");
while (true) {
System.out.println("Enter one of the following:\n\n" + "'1' : View Products\n" + "'2' : Purchase Products\n"
+ "'3' : Return Products\n" + "'4' : Exit");
int menuChoice = scnr.nextInt();
switch (menuChoice) {
case 1:
viewProducts();
break;
case 2:
purchaseProducts();
break;
case 3:
returnProducts();
break;
case 4:
System.out.println("Thank you for coming by. Please come again.");
System.exit(0);
break;
default:
System.out.println("INVALID OPTION. Please select an option 1-4");
scnr.close();
}
// server.cleanUp();
}
}
}
}
@JustaNobody Я думаю, что ОП означает работу в фоновом режиме
@Mitchell, вы должны предоставить шаги воспроизведения. Вопрос не показывает, где и как вы использовали &.
Прошу прощения у всех, пытался выделить слова курсивом, не получилось. Я отредактирую свое описание, чтобы сделать его более понятным. Моя вина.
Подождите, вам нужно только выполнить код ниже случая 2, только если ввод равен 2?
@JustaNobody да, это правильно. случай 1 все еще разрабатывается, который должен быть страницей администратора. Затем случай 2 будет отключен, чтобы код под ним можно было выполнить и пройти через различные подсказки в хранилище.
Блин -5 минусов. Я всего лишь студент с дрянным неотзывчивым инструктором, пытающимся учиться.




«... Когда я ввожу вариант 2, чтобы перейти к витрине магазина, он входит, и я подумал, что мне нужно будет создать метод, чтобы он мог войти в витрину магазина. ..."
«... Может ли кто-нибудь объяснить, что именно происходит в начале моего кода? Думаю, мне просто повезло».
Не повезло, так будет работать структура переключателя.
Это оптимизированный эквивалент нескольких операторов if-else.
Следующие две структуры эквивалентны с точки зрения потока управления.
Обратите внимание на ключевое слово break.
switch (choice) {
case 1:
StoreFront server = new StoreFront(0);
server.start(6666);
break;
case 2:
break;
}
if (choice == 1) {
StoreFront server = new StoreFront(0);
server.start(6666);
} else if (choice == 2) {
}
По сути, ваша вторая ветвь, случай 2, не имеет операторов атрибутов, поэтому ничего не выполняется, и переключатель завершается.
«... есть ли лучший способ реализовать это? Будет ли мой способ в некотором смысле «глючным»?»
Это может рассматриваться как «ошибка», поскольку ветки не требуют скобок, а если забыть добавить ключевое слово break, это может привести к конфликту кода.
Это очень старый синтаксис, абстрагированный от языка программирования C.
Подобно меткам, которых Java рекомендует избегать без необходимости.
Вот пример более новой структуры переключателя, которая имеет немного другой синтаксис.
Вместо двоеточия: вы используете ->. И предполагается перерыв.
switch (choice) {
case 1 -> {
StoreFront server = new StoreFront(0);
server.start(6666);
}
case 2 -> { }
}
Хорошо, спасибо, что прояснили это! Итак, я думаю, я сделал это правильно или есть лучший способ реализовать это? Будет ли мой путь в каком-то смысле «глючным»?
@Mitchell имейте в виду, что ваш код больше похож на if (choice == 1) { StoreFront server = new StoreFront(0); server.start(6666); } if (choice == 1 || choice == 2) { } /* do the rest */ - в опубликованном коде нет break;, поэтому нет else функциональности, case 1 проваливается в case 2 (в любом случае он пуст)
Спасибо, что указали на это, я изменил ответ.
@ Митчелл, есть два разных синтаксиса для структур переключения. Более новый, добавленный в Java 12, предполагает разрыв, поэтому вам не нужно писать его каждый раз. Я добавлю базовый пример в свой ответ.
@ Митчелл, я обновил ответ, включив в него ответ и пример.
@Reilas спасибо за это, отличное решение, но я не уточнил, что мы используем Java 11, поэтому это решение не может быть реализовано в моей программе, поскольку оно используется в Java 14 вперед.
@ Митчелл, нет проблем, рад, что это помогло. Я бы порекомендовал использовать область действия в квадратных скобках для каждой ветки, это может снизить вероятность ошибок, так как определяет отделение от каждого случая. И просто попробуйте попрактиковаться, добавив ключевые слова break.
@Reilas спасибо за это, я действительно ценю вашу помощь, очень проницательную. Когда вы говорите для каждой ветви, вы имеете в виду скобки после каждого оператора case?
Единственная проблема с вашим примером, которую я вижу, это эта часть:
switch (choice) {
case 1:
StoreFront server = new StoreFront(0);
server.start(6666);
case 2:
}
После выполнения случая 1 он «проваливается» на случай 2 (который еще предстоит определить). Вы должны использовать break после каждого случая, если вы не хотите, чтобы они провалились.
Вышеупомянутое эквивалентно
if (choice == 1) {
StoreFront server = new StoreFront(0);
server.start(6666);
}
// now execute what case 2 would do
И не забудьте выражение переключателя
for (int choice : new int[]{2,4}) {
int result = switch (choice) {
case 1, 2, 3 -> 5; // returns 5 for 1,2, or 3
case 4, 5, 6 -> { // similar for 4,5,or 6
System.out.println("returning 6");
yield 6;
}
default -> 1;
};
System.out.println("result = " + result);
}
отпечатки
result = 5
returning 6
result = 6
Спасибо. Это было быстрое предположение.
Ваш первый переключатель завершается до выполнения кода ниже. Если вы хотите, чтобы case 2 запускался под кодом, код должен быть в body из case 2.
добавьте break перед окончанием case 1, чтобы убедиться, что case 2 не запускается.
public static void main(String[] args) throws IOException {
while (true) {
System.out.println("Login to Admin site (1) or go to store front (2)?");
int choice = scnr.nextInt();
switch (choice) {
case 1:
StoreFront server = new StoreFront(0);
server.start(6666);
break; //stops execution here
case 2:
//} //don't close switch here
inventoryManager.initializeInventoryFromFile("inventory.json");
System.out.println("Welcome to the Game Store \n");
System.out.println("Please select an option from the menu");
System.out.println("***************************************");
System.out.println("************MAIN MENU ******************\n");
while (true) {
System.out.println("Enter one of the following:\n\n" + "'1' : View Products\n" + "'2' : Purchase Products\n"
+ "'3' : Return Products\n" + "'4' : Exit");
int menuChoice = scnr.nextInt();
switch (menuChoice) {
case 1:
viewProducts();
break;
case 2:
purchaseProducts();
break;
case 3:
returnProducts();
break;
case 4:
System.out.println("Thank you for coming by. Please come again.");
System.exit(0);
break;
default:
System.out.println("INVALID OPTION. Please select an option 1-4");
scnr.close();
}
// server.cleanUp();
}//close switch here
}
}
}
}
Что вы имеете в виду, добавляя & в начале?