2010-11-16 136 views
0

我有一個JSP文件這段代碼:爲什麼我不能實例化這個變量?

// MainHomePage pageApp = new MainHomePage(session); 

String pageValue=request.getParameter("page"); 
if((pageValue!=null) && (pageValue.compareTo("1")==0)) { 
    MainHomePage pageApp = new MainHomePage(session); 
} else if((pageValue!=null) && (pageValue.compareTo("2")==0)) { 
    MainAffittaAppartamenti pageApp = new MainAffittaAppartamenti(session); 
} else { 
    MainHomePage pageApp = new MainHomePage(session); 
} 

pageApp.someMethod(); 

如果我不上第一行它說(約pageApp)刪除註釋「無法找到符號」 ......爲什麼呢?無論如何,if-else都會實例化它。我錯了什麼?乾杯

回答

1

其實,你所擁有的不應該編譯,因爲pageApp不在最後一行的範圍內。看起來像變數聲明和變量賦值之間混淆。 Java允許您在同一個語句中執行這兩個操作,但是,您只能在同一個範圍內聲明一次變量。

如果您取消註釋第一個聲明,但仍將其他聲明留在ifelse語句中,那麼您將收到與重複聲明相關的編譯時錯誤。在ifelse語句塊中,您聲明瞭具有不同類型的相同變量。如果可能,您應該找到該變量的抽象類型,該類型由您正在實例化的兩種類型(例如,MainHomePageMainAffittaAppartamenti)共享,然後在ifelse塊之外以及在主要方法範圍內聲明它。

例如,如果MainAffittaAppartamenti是子類MainHomePage,那麼你可以這樣做:

MainHomePage pageApp; // Declare here but do not assign 

String pageValue=request.getParameter("page"); 
if((pageValue!=null) && (pageValue.compareTo("1")==0)) { 
    pageApp = new MainHomePage(session); 
} else if((pageValue!=null) && (pageValue.compareTo("2")==0)) { 
    pageApp = new MainAffittaAppartamenti(session); 
} else { 
    pageApp = new MainHomePage(session); 
} 

pageApp.someMethod(); 

注意,在內部塊我沒有再聲明變量(這是與它的類型定義它)。因爲根據我的假設陳述,MainAffittaAppartamentiMainHomePage的子類,那麼將其分配給pageApp仍然有效。

+0

eheh,問題是MainAffittaAppartamenti不是MainHomePage的子類:)所以有一個解決方案,如果他們不是類/子類? – markzzz 2010-11-16 14:02:58

+0

@markzzz - 除非您有權訪問源代碼,否則不是一件容易的事。如果他們不共享相同的接口或抽象基類,那麼你不能在共享變量上調用'someMethod'。如果你有權訪問源代碼,你可以用'someMethod()'或其他創建一個接口,並設置兩個類來實現該接口,然後用該接口聲明'pageApp'。 – 2010-11-17 19:41:18

+0

@markzzz - 另外,這些可能已經有一個共享的基類 - 這就是我所說的「你應該找到......這種變量的抽象類型,這兩種類型共享」。如果存在且該類型已經具有'someMethod()',那麼您將使用該類型進行聲明。 – 2010-11-17 19:43:19

3

如果你對此有何評論

MainHomePage pageApp = new MainHomePage(session); 

不會有任何變量命名pageApp可供pageApp.someMethod();

所以編譯器說,

pageApp要創建的,如果別人是局部的阻塞

About scope of variable

+0

我該如何把它分享? (不是本地只有塊) – markzzz 2010-11-16 13:07:52

+0

@markzz把它從所有的塊中,讀取更新的答案 – 2010-11-16 13:11:58

+0

uhm是的。但MainAffittaAppartamenti不是MainHomePage的子類。我想我不能解決這個問題:( – markzzz 2010-11-16 14:28:17

1

所以,你應該修改你的代碼如下:

MainHomePage pageApp;

String pageValue = request.getParameter(「page」); (pageValue!= null)& &(pageValue.compareTo(「1」)== 0)){ pageApp = new MainHomePage(session); (pageValue!= null)& &(pageValue.compareTo(「2」)== 0)){ pageApp = new MainAffittaAppartamenti(session); } else { pageApp = new MainHomePage(session); } pageApp.someMethod();

現在您使用您在開始時定義的相同pageApp。在你的代碼版本中,你創建了局部變量,它存在於if和else之間的塊中。

相關問題