2012-12-24 29 views
2

我試圖在我的代碼中處理大量不同的情況,這些情況依賴於從HTTPRequest對象中提取的屬性。事情是,不同的數據被拉到依賴於請求的東西來填充ArrayList,但是格式是相同的。有關ArrayList的條件賦值的範圍問題

if (request.getAttribute("timePeriod").equals(null)) { 
    ArrayList<ArrayList<MyWeirdObject>> HM = Test.getGlobalChallenge(); 
} 
else { 
    ArrayList<ArrayList<MyWeirdObject>> HM = Test.getGlobalChallengeByMonth(Test); 
} 

如果我在賦值之前沒有初始化它,代碼(在JSP中)說 - 當然 - 它不能解析HM對象。

ArrayList<ArrayList<MyWeirdObject>> HM = new ArrayList<ArrayList<MyWeirdObject>>(); 
if (request.getAttribute("timePeriod").equals(null)) { 
    ArrayList<ArrayList<MyWeirdObject>> HM = Test.getGlobalChallenge(); 
} 
else { 
    ArrayList<ArrayList<MyWeirdObject>> HM = Test.getGlobalChallengeByMonth(Test); 
} 

但是,如果我初始化它,它會抱怨重複的局部變量。我如何根據不同的情況將其設置爲不同的初始化/賦值?

回答

0

這之前我對變量範圍和實例化知道很多。我有兩個問題。

if (request.getAttribute("timePeriod").equals(null)) { 
    ArrayList<ArrayList<MyWeirdObject>> HM = Test.getGlobalChallenge(); 
} 
else { 
    ArrayList<ArrayList<MyWeirdObject>> HM = Test.getGlobalChallengeByMonth(Test); 
} 

這裏,變量只存在於它們各自的情況下;在這種情況之外引用它們當然失敗了,因爲它們並不存在於更廣的範圍內。

ArrayList<ArrayList<MyWeirdObject>> HM = new ArrayList<ArrayList<MyWeirdObject>>(); 
if (request.getAttribute("timePeriod").equals(null)) { 
    ArrayList<ArrayList<MyWeirdObject>> HM = Test.getGlobalChallenge(); 
} 
else { 
    ArrayList<ArrayList<MyWeirdObject>> HM = Test.getGlobalChallengeByMonth(Test); 
} 

而這一次失敗了,因爲我試圖無意中實例內的第二HM值的if/else塊,與第一衝突。

ArrayList<ArrayList<MyWeirdObject>> HM = new ArrayList<ArrayList<MyWeirdObject>>(); 
if (request.getAttribute("timePeriod").equals(null)) { 
    HM = Test.getGlobalChallenge(); 
} 
else { 
    HM = Test.getGlobalChallengeByMonth(Test); 
} 

正確的方法是在更廣泛的範圍內實例化變量,並在較小的範圍內引用它,而不重新初始化它。

5

不要在if塊中再次聲明ArrayList。

ArrayList<ArrayList<MyWeirdObject>> HM; 
if ((request.getAttribute("timePeriod") == null) { 
    HM = Test.getGlobalChallenge(); 
} 
else { 
    HM = Test.getGlobalChallengeByMonth(Test); 
} 
+0

啊,好的。出於某種原因,我認爲初始化它留下了空間,以便稍後填充 - 可能更好,只是讓它未初始化。謝謝! – rainydaymatt

1

您不能重新聲明變量。見下文

ArrayList<ArrayList<MyWeirdObject>> HM = new ArrayList<ArrayList<MyWeirdObject>>(); 
if ((request.getAttribute("timePeriod") == null) { 
    HM = Test.getGlobalChallenge(); 
} 
else { 
    HM = Test.getGlobalChallengeByMonth(Test); 
} 
+0

新列表的冗餘創建... –

+0

除非getGlobalChallange引發異常,否則HM爲空。如果HM返回時不能返回,會怎樣?如果不知道整個範圍,那麼最好實例化該數組並允許程序員確定是否可以返回null。 – Sorceri

2

試試這個:

ArrayList<ArrayList<MyWeirdObject>> HM; 
if ((request.getAttribute("timePeriod") == null) { 
    HM = Test.getGlobalChallenge(); 
} 
else { 
    HM = Test.getGlobalChallengeByMonth(Test); 
} 
1

申報HM外初始化爲null你的if/else,只是內部使用它你的if/else象下面這樣:

ArrayList<ArrayList<MyWeirdObject>> HM=null; 
    if ((request.getAttribute("timePeriod") == null) { 
     HM = Test.getGlobalChallenge(); 
    } 
    else { 
    HM = Test.getGlobalChallengeByMonth(Test); 
    }