2017-03-23 61 views
0

我已經寫過一個方法,它返回字符串的前兩個字符到它的前端和結尾。沒有錯誤,但它在eclipse上顯示「此方法必須返回字符串類型的結果」。在線編輯器上,它說「缺少返回聲明」。幫幫我!Java錯誤「此方法必須返回字符串類型的結果」無故發生

 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; 



    } 
+3

將'else if(str.length()<2)'改爲'else'。 – Eran

+0

我認爲它最後需要一個return語句,但如果我不想要其他答案,那麼我應該在方法結尾返回什麼? –

+0

爲什麼第二個如果 – Jens

回答

0

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; 



} 

的解釋是:編譯器沒有足夠的智慧由你的代碼覆蓋所有可能的情況了。

+0

'else'不是必需的。 – Jens

+0

我想你可能意思是*冗餘*。 –

+0

真是太遺憾了!謝謝你,安迪特納 –

1

您錯過了最後一個else if條件後的返回語句。如果你正確格式化你的代碼,你會注意到這一點。這就是爲什麼你應該總是在條件下使用大括號。

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 
} 
0

看看這更好的格式化代碼的版本:

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

} 

正如你所看到的,你需要一個else塊或在方法的最後一個默認的回報。

1

至於編譯器而言,這種結構是不是一套完整的邏輯路徑:

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 

有各種各樣的方式來構建它,真的。這一切都取決於個人喜好。關鍵是編譯器需要知道所有的邏輯路徑都被覆蓋了。它不會假設您實現的業務邏輯將保證這一點。

0

您知道字符串是不可變的,因此多次調用length()將始終產生相同的結果。

但是,編譯器並不知道:它會像其它任何類一樣對待String:它不會假設結果每次都是相同的。

你可以很容易地寫一個SillyString類,其length()返回一些隨機數。在這種情況下,ifelse of條件不一定是互補的;因此這兩個都不是真的。

因此,您需要提供一個else條件,或在您的條件之後完成該方法的某種方式。

或者,您可以使用有關字符串不變性的知識,並將else if變成純粹的else

0

萬一有'三個相互窮舉可能性A,B和C'。 如果你希望在一種方法中使用它們,它根據其中一個的真實性返回一些值。 一旦你有覆蓋if else

if(possibility == A) { 
    return X; 
}else if(possibility == B){ 
    return Y; 
} 
// if we are sure we have only 3 possibilities A,B and C then here only C is left. possibility == C must be true if above two are false. No need to check it explicitly. 

他們兩個如果兩個的三種可能的情況是假,那麼它的邏輯是,第三種情況將是如此。你需要這樣做會讓編譯器認爲還有更多的情況,它不知道返回值,因此它會給你一個編譯時錯誤。

因此,您需要在3種相互排斥的情況下做類似下面的事情。

if(possibility == A) { 
    return X; 
}else if(possibility == B){ 
    return Y; 
} 
return Z; 
相關問題