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
更好,因为它们是互斥比较。