Java错误“;此方法必须返回字符串类型的结果";无缘无故地发生

Java错误“;此方法必须返回字符串类型的结果";无缘无故地发生,java,string,methods,compiler-errors,Java,String,Methods,Compiler Errors,然后,我编写了一个方法,将字符串的前两个字符返回到其前端和结尾。没有错误,但在eclipse上说“此方法必须返回字符串类型的结果”。在线编辑器上显示“缺少返回语句”。救命啊 公共静态字符串front22(字符串str){ 如果(str.length()>=2) { 返回str.substring(0,2)+str+str.substring(0,2); } else if(str.length()else if是冗余的 public static String front22(String st

然后,我编写了一个方法,将字符串的前两个字符返回到其前端和结尾。没有错误,但在eclipse上说“此方法必须返回字符串类型的结果”。在线编辑器上显示“缺少返回语句”。救命啊

公共静态字符串front22(字符串str){
如果(str.length()>=2)
{
返回str.substring(0,2)+str+str.substring(0,2);
}

else if(str.length()
else if
是冗余的

public static String front22(String str) {

  if (str.length()>=2)
  {
      return str.substring(0,2)+str+str.substring(0,2);
  }

  else
  return str+str+str;



}

解释是:编译器不够聪明,无法让您的代码涵盖所有可能的情况。

否则,如果
是多余的

public static String front22(String str) {

  if (str.length()>=2)
  {
      return str.substring(0,2)+str+str.substring(0,2);
  }

  else
  return str+str+str;



}

解释是:编译器不够聪明,无法让您的代码覆盖所有可能的情况。

您在最后一个
条件之后缺少一个return语句,否则如果
条件,您会注意到。如果您的代码格式正确,您会注意到这一点。这就是为什么您应该始终在条件上使用大括号的原因

public static String front22(String str) {

    if (str.length()>=2) {
        return str.substring(0,2)+str+str.substring(0,2);
    } else if (str.length()<2)
        return str+str+str; // No braces, statement is under if confition

    // Missing return statement
}
公共静态字符串front22(字符串str){
如果(str.length()>=2){
返回str.substring(0,2)+str+str.substring(0,2);

}else if(str.length()在最后一个
else if
条件之后缺少一个return语句。如果正确格式化代码,您会注意到这一点。这就是为什么在条件上应该始终使用大括号

public static String front22(String str) {

    if (str.length()>=2) {
        return str.substring(0,2)+str+str.substring(0,2);
    } else if (str.length()<2)
        return str+str+str; // No braces, statement is under if confition

    // Missing return statement
}
公共静态字符串front22(字符串str){
如果(str.length()>=2){
返回str.substring(0,2)+str+str.substring(0,2);

}否则,如果(str.length()查看此格式更好的代码版本:

public static String front22(String str) {

  if (str.length()>=2){
      return str.substring(0,2)+str+str.substring(0,2);
  } else if (str.length()<2) {
      return str+str+str;
  }

}
公共静态字符串front22(字符串str){
如果(str.length()>=2){
返回str.substring(0,2)+str+str.substring(0,2);

}否则,如果(str.length()查看此格式更好的代码版本:

public static String front22(String str) {

  if (str.length()>=2){
      return str.substring(0,2)+str+str.substring(0,2);
  } else if (str.length()<2) {
      return str+str+str;
  }

}
公共静态字符串front22(字符串str){
如果(str.length()>=2){
返回str.substring(0,2)+str+str.substring(0,2);

}否则,如果(str.length()就编译器而言,此结构不是一组完整的逻辑路径:

if (some condition)
{
    // return something
}
else if (some other condition)
{
    // return something
}
举例说明:

if (some condition)
{
    // return something
}
else if (some other condition)
{
    // return something
}
// return *nothing*
也就是说,编译器告诉您存在一个不返回值的可能逻辑路径,这是无效的。(或者,更确切地说,编译器告诉您,它不能保证没有一个不返回值的可能逻辑路径。)

现在你可能会对自己说,“但是我的
if
条件涵盖了所有可能的情况!”虽然这可能是真的,但编译器并不知道这一点。编译器的工作不是对代码进行逻辑测试,而只是对代码进行语法验证。它不知道您可能已经直观地涵盖了所有可能的逻辑,它只是断言结构本身并不能保证逻辑

在您的情况下,只需使用
else
,即可解决此问题:

if (str.length()>=2)
{
    // return something
}
else
{
    // return something
}
您的直觉逻辑仍然成立,编译器现在可以假设任何未输入第一个
if
块的内容都将始终输入
else

您甚至可以进一步简化:

if (str.length()>=2)
{
    // return something
}
// return something

实际上,构造它有多种方法。这完全取决于个人偏好。问题是编译器需要知道所有逻辑路径都被覆盖。它不会假设您实现的业务逻辑能够保证这一点。

就编译器而言,此结构不是一套完整的逻辑路径:

if (some condition)
{
    // return something
}
else if (some other condition)
{
    // return something
}
举例说明:

if (some condition)
{
    // return something
}
else if (some other condition)
{
    // return something
}
// return *nothing*
也就是说,编译器告诉您存在一个不返回值的可能逻辑路径,这是无效的。(或者,更确切地说,编译器告诉您,它不能保证没有一个不返回值的可能逻辑路径。)

现在你可能会对自己说,“但是我的
if
条件涵盖了所有可能的情况!”虽然这可能是真的,但编译器并不知道这一点。编译器的工作不是对代码进行逻辑测试,而只是对代码进行语法验证。它不知道您可能已经直观地涵盖了所有可能的逻辑,它只是断言结构本身并不能保证逻辑

在您的情况下,只需使用
else
,即可解决此问题:

if (str.length()>=2)
{
    // return something
}
else
{
    // return something
}
您的直觉逻辑仍然成立,编译器现在可以假设任何未输入第一个
if
块的内容都将始终输入
else

您甚至可以进一步简化:

if (str.length()>=2)
{
    // return something
}
// return something

实际上,构造它有多种方法。这完全取决于个人偏好。关键是编译器需要知道所有逻辑路径都被覆盖。它不会假设您实现的业务逻辑会保证这一点。

您知道字符串是不可变的,所以调用
length()
多次将始终产生相同的结果

但是,编译器不知道:它像对待任何其他类一样对待
String
:它不假设每次的结果都是相同的

您可以轻松编写一个
SillyString
类,该类的
length()
返回一些随机数。在这种情况下,
if
else的条件不一定是互补的;因此这两个条件都不一定是真的

因此,您需要提供一个
else
条件,或者在条件之后以某种方式完成方法


或者,您可以利用有关字符串不可变性的知识,将
else if
转换为普通的
else
您知道字符串是不可变的,因此多次调用
length()
总是会得到相同的结果

但是,编译器不知道:它像对待任何其他类一样对待
String
:它不假设每次的结果都是相同的

您可以轻松编写一个
SillyString
类,该类的
length()
返回一些随机数