Недоступное заявление в 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;
}
Другие вопросы по тегам