Почему это недостижимое утверждение?
В нижней части этого кода я получаю ошибку "недостижимое утверждение". Я попробовал несколько вещей, но не могу понять, почему это происходит. Ошибка в нижней части кода (я прокомментировал // где ошибка) Пожалуйста, помогите указать мне правильное направление, я озадачен!
/**
* Describes a certain model.
*
* @author (Joshua Baker)
* @version (1.0)
*/
public class Model
{
public static final int IN_PER_FOOT = 12;
public static final int BASE_RATE = 60;
public static final int TALL_INCHES = 67;
public static final double THIN_POUNDS = 140.0;
public static final int TALL_THIN_BONUS = 5;
public static final int TRAVEL_BONUS = 4;
public static final int SMOKER_DEDUCTION = 10;
private String firstName;
private String lastName;
private int heightInInches;
private double weightInPounds;
private boolean travel;
private boolean smokes;
private String newHeight;
private int perHourRate;
/**
* Default constructor
*/
public Model()
{
setFirstName ("");
setLastName ("");
setHeightInInches (0);
setWeightInPounds (0.0);
setTravel (false);
setSmokes (false);
}
/**
*
*/
public Model (String whatIsFirstName, String whatIsLastName, int whatIsHeight, double whatIsWeight,
boolean canTravel, boolean smoker)
{
setFirstName (whatIsFirstName);
setLastName (whatIsLastName);
setHeightInInches (whatIsHeight);
setWeightInPounds (whatIsWeight);
setTravel (canTravel);
setSmokes (smoker);
}
/**
*@return first name
*/
public String getFirstName()
{
return firstName;
}
/**
*@return last name
*/
public String getLastName()
{
return lastName;
}
/**
*@return height in inches
*/
public int getHeightInInches()
{
return heightInInches;
}
/**
*@return the converted height
*/
public String getNewHeight()
{
return newHeight;
}
/**
*@return weight in pounds
*/
public double getWeightInPounds()
{
return weightInPounds;
}
/**
*@return models pay per hour rate
*/
public int getPerHourRate()
{
return perHourRate;
}
/**
*@return travel
*/
public boolean getTravel()
{
return travel;
}
/**
*@return smokes
*/
public boolean getSmokes()
{
return smokes;
}
/**
* models first name
*/
public void setFirstName(String whatIsFirstName)
{
firstName = whatIsFirstName;
}
/**
* models last name
*/
public void setLastName(String whatIsLastName)
{
lastName = whatIsLastName;
}
/**
* models height in inches
*/
public void setHeightInInches(int whatIsHeight)
{
if (whatIsHeight >0){
heightInInches = whatIsHeight;
}
}
/**
* models weight in pounds
*/
public void setWeightInPounds(double whatIsWeight)
{
if (whatIsWeight >0){
weightInPounds = whatIsWeight;
}
}
/**
* can model travel
*/
public void setTravel(boolean canTravel)
{
travel = canTravel;
}
/**
* does model smoke
*/
public void setSmokes(boolean smoker)
{
smokes = smoker;
}
/**
* Converts to feet and inches
*/
public String convertheightToFeetInches()
{
int leftOver = (heightInInches %= IN_PER_FOOT);
int newHeight = (heightInInches % IN_PER_FOOT);
return newHeight + "Foot" + leftOver + "Inches";
}
/**
*
*/
public int calculatePayPerHour(){
if (heightInInches >= TALL_INCHES && (weightInPounds <= THIN_POUNDS)) {
perHourRate = BASE_RATE + TALL_THIN_BONUS;
return perHourRate;
}
else
{
perHourRate = BASE_RATE;
return perHourRate;
}
if (travel) { //unreachable statement
perHourRate = BASE_RATE + TRAVEL_BONUS;
return perHourRate;
}
else
{
perHourRate = BASE_RATE;
return perHourRate;
}
if (smokes) { //unreachable statement
perHourRate = BASE_RATE - SMOKER_DEDUCTION;
return perHourRate;
}
else {}
}
/**
* Displays details
*/
public void displayInfo()
{
System.out.print("Name : " + getFirstName() + " ");
System.out.println(getLastName());
System.out.println("Height : " + getNewHeight() + "inches");
System.out.println("Weight : " + getWeightInPounds() + "pounds");
System.out.print("Travel : " + getTravel() + " " );
System.out.print("Smokes : " + getSmokes() );
System.out.println("Hourly rate : " + getPerHourRate() );
}
}
5 ответов
Это потому, что ваша программа вернется с вашего первого if block
или соответствующий else
блок: -
if (heightInInches >= TALL_INCHES && (weightInPounds <= THIN_POUNDS)) {
perHourRate = BASE_RATE + TALL_THIN_BONUS;
return perHourRate;
}
else
{
perHourRate = BASE_RATE;
return perHourRate;
}
System.out.println("This will never get printed. And will show compiler error");
Таким образом, любой из двух операторов возврата будет выполнен. И, следовательно, любой дополнительный код недоступен.
Кажется, что вы хотите получить совокупную сумму всех service rates
чтобы получить финал perHourRate
для этого вы можете удалить return statement
от каждого из if-else
блок. И тогда для всех if-else
блок после первого, вместо назначения current price
в perHourRate
сделать compound addition
+=
,
Кроме того, так как вы работаете над полем экземпляра - perHourRate
Вам не нужно возвращать его вообще. Изменения, которые вы сделали на perHourRate
можно получить с помощью getPerHourRate()
, Итак, измените тип возвращаемого значения на void
,
Можете ли вы попробовать обновить свой calculatePayPerHour
метод к следующему:
public void calculatePayPerHour(){
if (heightInInches >= TALL_INCHES && (weightInPounds <= THIN_POUNDS)) {
perHourRate = BASE_RATE + TALL_THIN_BONUS; // Initial assignment
} else {
perHourRate = BASE_RATE; // Initial assignment
}
/** Rest of the assignment will be compound assignment, since you
are now updating the `perHourRate` **/
if (travel) {
perHourRate += TRAVEL_BONUS;
} // You don't need an else now. Since BASE_RATE is already added
if (smokes) {
perHourRate -= SMOKER_DEDUCTION;
}
}
if (heightInInches >= TALL_INCHES && (weightInPounds <= THIN_POUNDS)) {
perHourRate = BASE_RATE + TALL_THIN_BONUS;
return perHourRate; // <------------
}
else
{
perHourRate = BASE_RATE;
return perHourRate; // <------------
}
Независимо от вашего роста или веса, одно из этих двух возвратов сработает, поэтому любое утверждение после него никогда не будет выполнено. Это идентично приведенному ниже коду.
if (heightInInches >= TALL_INCHES && (weightInPounds <= THIN_POUNDS)) {
perHourRate = BASE_RATE + TALL_THIN_BONUS;
}
else
{
perHourRate = BASE_RATE;
}
return perHourRate;
//unreachable
Внутри вашего calculatePayPerHour
У вас есть метод if/else, и оператор никогда не будет достигнут, потому что в обоих случаях вы возвращаете результат:
if (heightInInches >= TALL_INCHES && (weightInPounds <= THIN_POUNDS)) {
perHourRate = BASE_RATE + TALL_THIN_BONUS;
return perHourRate; // you return in the if
}
else
{
perHourRate = BASE_RATE;
return perHourRate; // you return in the else
}
... the execution will never reach here
- В вашем методе
public int calculatePayPerHour()
первый оператор if else возвращает значение в любом случае (в блоке if и else). - Если вы не запустите программу, вы увидите, что поток управления никогда не достигнет операторов ниже этого блока, следовательно, ваше исключение.
В if/else выше кода у вас уже есть 2 оператора возврата... Это означает, что он никогда не достигнет кода ниже этого..