Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不是';这个公共字符串函数不工作吗?_Java_String_Function_Methods_Return - Fatal编程技术网

Java 为什么不是';这个公共字符串函数不工作吗?

Java 为什么不是';这个公共字符串函数不工作吗?,java,string,function,methods,return,Java,String,Function,Methods,Return,它说它必须返回一个字符串,但我看不出有什么问题?我想星期几应该很好吧 public String getDayOfWeek(){ if(numericDayOfWeek==0){ return "Saturday"; } if(numericDayOfWeek==1){ return "Sunday"; } if(numericDayOfWeek==2)

它说它必须返回一个字符串,但我看不出有什么问题?我想星期几应该很好吧

 public String getDayOfWeek(){
         if(numericDayOfWeek==0){
             return "Saturday";
         }
         if(numericDayOfWeek==1){
             return "Sunday";
         }
         if(numericDayOfWeek==2){
             return "Monday";
         }
        if(numericDayOfWeek==3){
             return "Tuesday";
         }
        if(numericDayOfWeek==4){
            return "Wednesday";
         }
        if(numericDayOfWeek==5){
            return "Thursday";
         }
         if(numericDayOfWeek==6){
             return "Friday";
         }
     }
这是完整的代码

public class DayOfWeek {
    int myMonth, myDayOfMonth, myYear, myAdjustment, numericDayOfWeek;

    public DayOfWeek(int month, int dayOfMonth, int  year){
        myMonth = month;
        myDayOfMonth = dayOfMonth;
        myYear = year;
    }
    public int getNumericDayOfWeek(){
        if(myMonth==1){
            myAdjustment = 1;
            if(myYear%4==0){
                myAdjustment-=1;
            }
        }
        if(myMonth==2){
            myAdjustment = 4;
            if(myYear%4==0){
                myAdjustment-=1;
            }
        }
        if(myMonth==3){
            myAdjustment = 4;
        }
        if(myMonth==4){
            myAdjustment = 0;
        }
        if(myMonth==5){
            myAdjustment = 2;
        }
        if(myMonth==6){
            myAdjustment = 5;
        }
        if(myMonth==7){
            myAdjustment = 0;
        }
        if(myMonth==8){
            myAdjustment = 3;
        }
        if(myMonth==9){
            myAdjustment = 6;
        }
        if(myMonth==10){
            myAdjustment = 1;
        }
        if(myMonth==11){
            myAdjustment = 4;
        }
        if(myMonth==12){
            myAdjustment = 6;
        }
        int fourDivides = myYear / 4;
        numericDayOfWeek = myAdjustment + myDayOfMonth + (myYear-1900) + fourDivides; 
        return numericDayOfWeek;

    }
     public String getDayOfWeek(){
         if(numericDayOfWeek==0){
             return "Saturday";
         }
         if(numericDayOfWeek==1){
             return "Sunday";
         }
         if(numericDayOfWeek==2){
             return "Monday";
         }
        if(numericDayOfWeek==3){
             return "Tuesday";
         }
        if(numericDayOfWeek==4){
            return "Wednesday";
         }
        if(numericDayOfWeek==5){
            return "Thursday";
         }
         if(numericDayOfWeek==6){
             return "Friday";
         }
     }
     public int getMonth(){

     }
     public String getMonthString(){

     }
     public int getDayOfMonth(){

     }
     public int getYear(){

     }

}

如果没有一个条件通过,即它们的计算结果都是
false
,则该方法不会返回任何内容。在末尾添加默认返回值

public String getDayOfWeek(){
     if(numericDayOfWeek==0){
         return "Saturday";
     }
     if(numericDayOfWeek==1){
         return "Sunday";
     }
     if(numericDayOfWeek==2){
         return "Monday";
     }
     if(numericDayOfWeek==3){
         return "Tuesday";
     }
     if(numericDayOfWeek==4){
        return "Wednesday";
     }
     if(numericDayOfWeek==5){
        return "Thursday";
     }
     if(numericDayOfWeek==6){
         return "Friday";
     }
     return "Error";
 }
编译器考虑所有路径。如果执行了
If
语句,则不会返回任何内容。在这种情况下,它将无法编译,因为该方法不能保证由其定义指定的契约,即返回
字符串


遵循注释或其他答案,了解如何可能使其性能更好或更易于阅读(
切换案例
)。

Sotirios是正确的,但更好的解决方案是使用案例陈述:

switch(numericDayOfWeek)
{
    case 0:
      return "Saturday";
    case 1:
      return "Sunday";
    case 2:
      return "Monday";
    case 3:
      return "Tuesday";
    case 4:
      return "Wednesday";
    case 5:
      return "Thursday";
    case 6:
      return "Friday";
    default:
      return "Error";
}
这应该起作用:

public String getDayOfWeek(){
    if(numericDayOfWeek==0){
         return "Saturday";
    }
    else if(numericDayOfWeek==1){
        return "Sunday";
    }
    else if(numericDayOfWeek==2){
         return "Monday";
    }
    else if(numericDayOfWeek==3){
        return "Tuesday";
    }
    else if(numericDayOfWeek==4){
        return "Wednesday";
    }
    else if(numericDayOfWeek==5){
       return "Thursday";
    }
    else if(numericDayOfWeek==6){
        return "Friday";
    }
    else{
        return "Error";
    }
}

编译器错误的原因是编译器无法确定代码是否总是从方法返回字符串

如果numericDayOfWeek不在0到6的范围内,则函数不会指定应返回的值,编译器也无法知道或保证numericDayOfWeek始终在所需的范围内

不幸的是,即使在简单的情况下,编译器也无法确保返回
语句。采取以下琐碎(无用)的方法:

// I have a compiler error!
public boolean testReturn()
{
    final boolean condition = true;

    if (condition) return true;

    if (!condition) return false;
}
上述操作将导致编译器错误,表示该方法必须返回布尔类型。我们可以通过将第二个
if
语句更改为
else
子句来轻松修复它,因为这是允许编译器确保执行一个或其他代码块的少数方法之一

// I compile!
public boolean testReturn()
{
    final boolean condition = true;

    if (condition) return true
    else return false;
}
规则是,具有返回类型的方法不能正常完成,而必须按照以下方式突然完成(此处通过
return
语句或异常突然指示)。编译器根据中定义的规则查看是否可以正常终止,因为它还定义了正常完成的规则

在您的具体示例中,我建议考虑将
IllegalArgumentException
作为方法的最后一行,并将
if
语句替换为
switch
语句。例如

public String getDayOfWeek()
{
    switch(numericDayOfWeek)
    {
        case 0: return "Saturday";
        case 1: return "Sunday";
        case 2: return "Monday";
        case 3: return "Tuesday";
        case 4: return "Wednesday";
        case 5: return "Thursday";
        case 6: return "Friday";
    }

    throw new IllegalArgumentException("numericDayOfWeek is out of range: " + numericDayOfWeek);
}

您也可以在
switch
语句的
default
子句中抛出异常,但在这种情况下,我会说这只是个人偏好的问题,我更喜欢在
开关之外抛出异常。

我可以将numericDayOfWeek作为您的方法的参数。@AleZalazar在OP的问题中,这是一个实例字段。我见过它,但我一直以同样的方式思考。如果忘记在getDayOfWeek()之前调用getNumericDayOfWeek()会怎么样?至少您应该使用getter和惰性初始化。而不是
if..then
您应该使用
开关
,这样您就可以避免在最坏的情况下进行7次比较(对于方法
getDayOfWeek
),或者至少
if..then..else
,因为它们是独占的。如果if条件都不匹配,函数将返回什么?这就是您的问题所在。也可以查看
Calendar
类中的
getDisplayName()
。在这里重新发明轮子没有多大意义。不会的。您需要最后一个
else
。如果客户端没有对值范围
numericaydayofweek
进行验证,您将获得值1231的
Friday
。这有意义吗?好的,我试图解决编译问题,在本例中使用
if-then-else
这句话比
if-then
更好,因为它们是互斥比较。