Недоступное заявление в Java
Я работаю в BlueJ для своего университетского курса, и мне было назначено базовое задание, где нам нужно, чтобы пользователь вводил определенную информацию о DVD, такую как режиссер, имя, время работы и т. Д.
Я пишу на Java и тоже использовал Genio. Следующий код показывает, как я получил и установил информацию в переменных;
public void getDVDInfo() {
//Ask for info
System.out.println("Please Enter the Film Info:");
System.out.println("Film Name: ");
System.out.println("Film Director: ");
System.out.println("Lead Actor/Actress: ");
System.out.println("Running Time: ");
}
public void setDVDInfo() {
//set user input to variables
filmName = Genio.getString();
director = Genio.getString();
leadActor = Genio.getString();
runTime = Genio.getInteger();
}
Все это работает в соответствии с компилятором, который я использовал в BlueJ, но когда я закодировал функцию, чтобы вернуть информацию пользователю, вот так;
public String seeDVDInfo() {
return filmName;
return director;
return leadActor;
}
public int seeRunTime() {
return runTime;
}
возникла ошибка компиляции в return director;
это было недостижимое утверждение. Я не понимаю, откуда это, все выглядит правильно, кто-нибудь может мне помочь?
Заранее спасибо хх
7 ответов
Если это действительно метод в вашем коде:
public String seeDVDInfo() {
return filmName;
return director;
return leadActor;
}
Затем проблема заключается в том, что метод завершается с помощью оператора return. Он выйдет из метода с указанным значением.
У вас есть разные способы решения проблемы, в зависимости от информации, которую вы хотите предоставить / использовать:
public String seeDirector() {
return director;
}
public String seeFilmName() {
return director;
}
public String leadActor() {
return director;
}
Учитывая, что Java является языком ООП, я бы предложил создать класс Film
которая содержит / инкапсулирует эту информацию, которая может быть возвращена. Так что на самом деле это будет выглядеть примерно так:
public class Film {
private String director;
private String filmName;
private String leadActor;
public Film(String director, String filmName, String leadActor) {
this.director = director;
this.filmName = filmName;
this.leadActor = leadActor;
}
public String getFilmName() {
return filmName;
}
public void setFilmName(String filmName) {
this.filmName = filmName;
}
public String getDirector() {
return director;
}
public void setDirector(String director) {
this.director = director;
}
public String getLeadActor() {
return leadActor;
}
public void setLeadActor(String leadActor) {
this.leadActor = leadActor;
}
}
Проблема здесь:
public String seeDVDInfo() {
return filmName;
return director;
return leadActor;
}
- Вы не можете иметь несколько операторов возврата в методе в Java.
- Однажды ты
return filmName;
, другие операторы не могут выполняться, поэтому выдает ошибку "Недостижимый оператор".
Посмотрите эту ветку, чтобы узнать, почему Unreachable Statement является ошибкой в Java.
У вас ошибка - первая return
код будет запущен и вернет значение filmName
, выход из метода, поэтому другие обратные вызовы не могут быть достигнуты.
Метод может вернуть только один объект. Вы можете использовать сложный объект для хранения некоторых данных и их возврата.
Я предлагаю вам создать класс DvdInfo:
public class DvdInfo {
String filmName;
String director;
String leadActor;
// getters & setters...
}
И используйте его как тип возвращаемого значения:
public DvdInfoseeDVDInfo() {
new DvdInfo(filmName, director, leadActor);
}
Первая инструкция в методе seeDVDInfo "return filmName" возвращает переменную filmName и выходит из метода seeDVDInfo... Таким образом, остальные 2 инструкции никогда не будут выполнены. Следовательно, возвращаемый директор и возвращаемый leadActor являются "недоступными"....
public String seeDVDInfo() {
return filmName;
return director;
return leadActor;
}
Из учебников по Java:
A method returns to the code that invoked it when it completes all the statements in the method, reaches a return statement, or throws an exception (covered later), whichever occurs first.
http://docs.oracle.com/javase/tutorial/java/javaOO/returnvalue.html
Это связано с тем, что после возврата из метода любой код, оставшийся после оператора return, будет недоступен, поэтому он не будет компилироваться.
Здесь я попытаюсь объяснить вам 3 сценария.
Сценарий 1: для Кодекса,
public void helloWorld() {
System.out.println("Hello");
return;
System.out.println("World");
}
Строка Prited, выделенная жирным шрифтом, не будет компилироваться.
Сценарий 2:
public void helloWorld() {
System.out.println("Hello");
if(true) {
return;
}
System.out.println("World");
}
Это успешно компилируется. Самая общая логика в этих правилах заключается в том, что код, окруженный блоком, недоступен, если условное выражение, решающее, что оно оценивается как ложное, а затем блок считается недостижимым. Тогда это становится ошибкой.
Только для конструкции "если" правило отличается. Условное выражение не оценивается и не принимается. Каким бы ни было выражение внутри условия if, оно не оценивается, чтобы решить, достижим ли блок кода, и поэтому мы не получим ошибку, даже если у нас есть константное значение 'false' в качестве условного выражения в операторе if. Это рассматривается специально, чтобы дать возможность для разработчика. Разработчики могут использовать флаговую переменную в операторе if с конечными значениями по умолчанию, равными false или true. Просто изменив переменную flag с false на true или наоборот, разработчики могут перекомпилировать программу и использовать ее по-другому.
Сценарий 3:
public void helloWorld() {
System.out.println("HelloWorld");
while(true) {
return;
}
System.out.println("World");
}
Это дает недостижимую ошибку компиляции исключений, как описано выше.
Вы не можете иметь несколько возвратов в одном методе, поэтому следующая строка после возврата недоступна
public String seeDVDInfo() {
return filmName;
//return director;
//return leadActor;
}
Вы пытаетесь вернуть три строки -> не удалось.
Используйте это вместо:
public List<String> seeDVDInfo() {
List<String> dvdInfos = new ArrayList<>();
dvdInfos.add(filmName);
dvdInfos.add(director);
dvdInfos.add(leadActor);
return dvdInfos;
}