【问题标题】:Why isn't this public String function working?为什么这个公共字符串函数不起作用?
【发布时间】:2013-09-10 22:24:44
【问题描述】:

这是说它必须返回一个字符串,但我看不出有什么问题?我认为 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 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(){

     }

}

【问题讨论】:

  • 你应该使用switch而不是if..then,这样你就可以避免在最坏的情况下进行7比较(对于方法getDayOfWeek),或者至少if..then..else,因为它们是独占的。
  • 如果if条件都不匹配,函数会返回什么?这就是你的问题。
  • 还可以在Calendar 类中查看getDisplayName()。在这里重新发明轮子没有多大意义。 docs.oracle.com/javase/7/docs/api/java/util/…

标签: java string function methods return


【解决方案1】:

Sotirios 是正确的,但这里更好的解决方案是使用 case 语句:

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";
}

【讨论】:

    【解决方案2】:

    如果没有一个条件通过,即。他们都评估为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 语句,那么return 将没有任何内容。在这种情况下,它将无法编译,因为该方法不能保证其定义所指定的合同,即。返回String

    关注 cmets 或其他答案,了解如何可能使其性能更好或更易于阅读 (switch-case)。

    【讨论】:

    • 我可以补充一下 numericDayOfWeek 应该是你方法的一个参数。
    • @AleZalazar 在 OP 的问题中,它是一个实例字段。
    • 我见过,但我一直在想同样的方式。如果您忘记在 getDayOfWeek() 之前调用 getNumericDayOfWeek() 怎么办?至少你应该使用 getter 和惰性初始化。
    【解决方案3】:

    这应该可行:

    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";
        }
    }
    

    【讨论】:

    • 不会的。你需要最后一个else
    • 如果客户端不对numericaDayOfWeek 取值的范围进行验证,您将得到Friday 的值1231231。这有意义吗?
    • 好的,我正在尝试修复编译问题,并且在这种情况下使用比if-then更好的句子if-then-else,因为是排他性比较。
    【解决方案4】:

    编译器错误的原因是编译器不能确定你的代码总是从你的方法返回一个字符串。

    如果 numericDayOfWeek 不在 0 到 6 的范围内,您的函数没有指定应该返回什么值,并且编译器无法知道或保证 numericDayOfWeek 将始终在所需的范围内.

    不幸的是,编译器在确保return 语句的能力方面受到限制,即使在简单的情况下也是如此。采取以下琐碎(且无用)的方法:

    // 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 语句或异常表示)每个JLS 8.4.7。编译器会根据JLS 14.21 Unreachable Statements 中定义的规则查看是否可以正常终止,因为它还定义了正常完成的规则​​。

    对于您的具体示例,我建议考虑将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 子句中抛出异常,但在这种情况下,我想说这只是个人喜好问题,我更喜欢在switch 之外。

    【讨论】:

      猜你喜欢
      • 2017-07-07
      • 2020-07-04
      • 2012-11-30
      • 1970-01-01
      • 2020-01-06
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多