2013-05-10 74 views
0

当编译这个程序时,我得到一个“reformatName”方法的错误,因为它“必须返回一个java.lang.String类型的结果”,我假设它已经返回了!该方法采用的每个路径都会返回一个字符串。 (很抱歉,如果这是可怕的格式化/写的;这是我第一次在这里发帖。)Java String返回方法不返回字符串?

import java.util.*; 
public class NameFormatChallenge { 
    public static void main(String[] args) { 
    Scanner wordInput = new Scanner(System.in); 
    System.out.println("Enter a name"); 
    String userInput = wordInput.nextLine(); 
    String[] name = userInput.split(" "); 
    System.out.println(reformatName(name)); 
} 

public static String reformatName(String[] name) { 
    if(name[1].charAt(1)=='.') 
     return formatOne(name); 
    else if(name[1].length()==1) 
     return formatTwo(name); 
    else if(name[0].charAt(name[0].length()-1)!=',') 
     return formatThree(name); 
    else if(name[2].length()>2) 
     return formatFour(name); 
    else if(name[2].charAt(name[2].length()-1)=='.') 
     return formatFive(name); 
    else if(name[2].length()==1) 
     return formatSix(name); 
} 

public static String formatOne(String[] name) { 
    name[1] = name[1].substring(0,1); 
    String tempZero = name[0]; 
    String tempOne = name[1]; 
    String tempTwo = name[2]; 
    name[0] = tempTwo; 
    name[1] = tempZero; 
    name[2] = tempOne; 
    return nameConcatenation(name); 
} 

public static String formatTwo(String[] name) { 
    String tempZero = name[0]; 
    String tempOne = name[1]; 
    String tempTwo = name[2]; 
    name[0] = tempTwo; 
    name[1] = tempZero; 
    name[2] = tempOne; 
    return nameConcatenation(name); 
} 

public static String formatThree(String[] name) { 
    String tempZero = name[0]; 
    String tempOne = name[1]; 
    String tempTwo = name[2]; 
    name[0] = tempTwo; 
    name[1] = tempZero; 
    name[2] = tempOne; 
    return nameConcatenation(name); 
} 

public static String formatFour(String[] name) { 
    String tempOne = name[1]; 
    String tempTwo = name[2]; 
    name[1] = tempTwo; 
    name[2] = tempOne; 
    return nameConcatenation(name); 
} 

public static String formatFive(String[] name) { 
    name[2] = name[2].substring(0,1); 
    String tempOne = name[1]; 
    String tempTwo = name[2]; 
    name[1] = tempTwo; 
    name[2] = tempOne; 
    return nameConcatenation(name); 
} 

public static String formatSix(String[] name) { 
    String tempOne = name[1]; 
    String tempTwo = name[2]; 
    name[1] = tempTwo; 
    name[2] = tempOne; 
    return nameConcatenation(name); 
} 

public static String nameConcatenation(String[] name) { 
    StringBuilder b = new StringBuilder(); 
    int endOfArrZero = name[0].length()-1; 
    int endOfArrOne = name[1].length(); 
    int endOfArrTwo = name[2].length()+1; 
    for (int i = 0; i<3; i++) { 
     b.append(String.valueOf(name[i])); 
     if(i!=2) { 
     b.append(" "); 
     } 
    } 
    if(b.charAt(endOfArrZero) != ',') { 
     b.insert(endOfArrZero,","); 
     endOfArrOne=endOfArrOne+1; 
     endOfArrTwo=endOfArrTwo+1; 
    } 
    if(b.charAt(endOfArrOne) == '.') { 
     b.deleteCharAt(endOfArrOne); 
     endOfArrTwo=endOfArrTwo-1; 
    } 
    String Finalname = b.toString(); 
    return Finalname; 
} 
+1

我已经采取了修复压痕的自由。一般来说,您应该避免使用制表符,因为不同的环境使用不同数量的列。堆栈溢出使用4列选项卡,但Java标准需要8列选项卡,所以最好使用空格。我喜欢在vim中编写我的代码,展开标签,然后在发布代码时将n-paste粘贴到Stack Overflow。 – 2013-05-10 00:46:20

回答

2

reformatName方法不会返回一个字符串,如果没有条件语句的计算结果为true。这段代码的执行将贯穿每个条件,直到没有返回语句的方法结束。通过添加return "";我尊重该方法的签名,但您应该抛出异常或返回名称。

public static String reformatName(String[] name) { 
    if(name[1].charAt(1)=='.') 
     return formatOne(name); 
    else 
    if(name[1].length()==1) 
     return formatTwo(name); 
    else 
    if(name[0].charAt(name[0].length()-1)!=',') 
     return formatThree(name); 
    else 
    if(name[2].length()>2) 
     return formatFour(name); 
    else 
    if(name[2].charAt(name[2].length()-1)=='.') 
     return formatFive(name); 
    else 
    if(name[2].length()==1) 
     return formatSix(name); 

    return ""; 
    /* this will fix it but I'm not sure what 
    you should return when no conditions evaluate to true.*/ 
} 
+1

我认为如果你把“如果其中一个条件不符合”改为“如果没有符合条件”,它就不会被误解。 – 2013-05-10 00:46:31

+0

@DanielFischer我更新了一点不同的措辞让我知道你的想法。你的权利虽然双重否定令人困惑。 – 2013-05-10 00:52:00

+0

这很好,比我的建议好,我想。 – 2013-05-10 00:54:02

0

如果没有一个if匹配,该函数将不返回任何内容。

编译器无法处理。

0

如果它失败了所有的条件,它什么都不返回。那就是问题所在。

0

您应该从if循环中返回字符串。因为return语句仅在特定条件下发生,并且如果没有发生该条件,则没有返回方法。