[英]Having trouble understanding return type placement( Big Java Ex 6.8)
當前,在我的書的這一章中,我們討論for循環和循環。 有時我遇到一個問題,該方法需要我返回一些東西。 例如,考慮下面的代碼。 基本上,練習是將所有因素按升序排列。 現在這是問題
如您所見,我需要在for循環之外使用return語句。 現在,我想我的書沒有完全正確地解釋這一點,或者我不理解Java中正確返回的概念,但是如果您願意,我們的return語句是否總是必須在最外面的縮進中?
問題是,我真的不想在for循環之外返回任何東西。 我只想在那種情況下還i
。 為什么Java不讓我這樣做? 有什么好的反作用?
自從我開始學習循環和for循環以來,我一直很難理解這一點。 我想我可以只使用system.out.println(i)
而不返回它? 但后來我應該怎么return
? 我還可以將其設置為void
類型,然后再創建另一種方法來打印它,我猜嗎?
class factors{
private int num;
public factors(int num)
{
this.num = num;
}
public int getFactors()
{
for(int i = 1 ; i<num ; i++)
{
if (num % i == 0)
{
return i;
}
}
// I NEED TO PUT A RETURN STATEMENT HERE
}
}
public class test{
public static void main(String [] args)
{
factors fact = new factors(20);
System.out.println(fact.getFactors());
}
}
現在就可以工作(我不太喜歡我的解決方案)
class factors{
private int num;
public factors(int num)
{
this.num = num;
}
public void getFactors()
{
for(int i = 1 ; i<num ; i++)
{
if (num % i == 0)
{
System.out.println(i);
}
}
}
}
public class test{
public static void main(String [] args)
{
factors fact = new factors(20);
fact.getFactors();
}
}
問題是,我真的不想在for循環之外返回任何東西。 我只想在那種情況下還我。 為什么Java不讓我這樣做?
Java使您可以做到這一點。 達到條件后,在循環內部返回是沒有問題的。
Java允許您有多個return語句,因此添加另一個return 0;
允許循環之后。
Java到達第一個 return語句后即返回,並且其他return語句不執行(該方法不再執行)(除了一些罕見的帶有try-catch和return的極端情況,但這完全是另一回事)。
但是為什么要這樣做呢?
Java要求,對於所有可能的路徑 ,必須存在具有正確類型的return
。 即使您自己可以數學證明Java抱怨的路徑都不會被采用,編譯器也可能無法在運行時證明該路徑是不可能的 。 因此,您只需要在其中添加帶有虛擬值的返回值即可。
在您的具體示例中 ,存在循環永遠不會執行的情況。 如果num <= 0
,則永遠不會滿足循環條件,並且跳過整個循環主體。 如果沒有返回值,則該方法無效,因為您無法從具有返回類型int
的方法中返回任何內容。
因此,在您的示例中,編譯器實際上比您聰明,並且可以防止您犯錯誤-因為它找到了您認為不會發生的路徑。
new factors(-1).getFactors(); // you don't check the passed value at all ;)
從您的評論看來,您想返回所有因素。 在Java中,從函數返回一次,並且僅返回一次。 這意味着您必須匯總結果並返回一個List
或值array
:
public List<Integer> getFactors(int num) {
List<Integer> factors = new ArrayList<>();
for (int i = 1 ; i<num ; i++)
{
if (num % i == 0)
{
factors.add(i);
}
}
return factors;
}
public static void main(String[] args) {
System.out.println(Arrays.toString(new factors(20).getFactors());
// prints a comma-separated list of all factors
}
如果您願意,我們的return語句是否總是必須位於最外面的縮進位置?
沒有。
但是 , 所有潛在的代碼路徑都必須返回某些內容。 考慮以下結構:
for(int i = 1 ; i<num ; i++)
{
if (num % i == 0)
{
return i;
}
}
如果num
是一個永不輸入循環本身的值,會發生什么情況? 或者, if
從不滿足if
條件,會發生什么? 不會遇到任何return
語句,這是無效的。
編譯器必須保證該方法將在任何和所有潛在的運行時條件下返回某些內容 。 因此,雖然從循環內返回是完全有效的,但如果從未到達該return
語句,則還必須提供返回邏輯。
Java不允許您這樣做,因為如果if (num % i == 0)
永遠不為真會發生什么?
方法的返回類型為int
,因此它必須返回一個int
。 而且if語句可能為假,並非每個條件都由return語句覆蓋。
因此,如果您願意,可以返回-1或其他無效值。 然后,您知道該函數沒有找到它想要的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.