为什么我无法实例化此变量?

时间:2010-11-16 13:00:59

标签: java

我在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会在任何情况下实例化它。我错了什么?干杯

3 个答案:

答案 0 :(得分:3)

如果您发表评论

MainHomePage pageApp = new MainHomePage(session);  

pageApp.someMethod();

不会有任何名为pageApp的变量

所以编译说,

你在if中创建的pageApp是否为本地阻止

About scope of variable

答案 1 :(得分:1)

所以,你应该修改你的代码如下:

MainHomePage pageApp;

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();

现在使用您在开头定义的相同pageApp。在您的代码版本中,您创建了局部变量,该变量位于if和else之间的块中。

答案 2 :(得分:1)

实际上,你所拥有的东西不应该编译,因为pageApp不在最后一行的范围内。您似乎对变量声明和变量赋值感到困惑。 Java允许您在同一语句中执行这两个操作,但是,您只能在同一范围内声明一次变量。

如果您取消注释第一个声明但仍然将其他声明留在ifelse语句中,那么您将收到与重复声明相关的编译时错误。在ifelse语句块中,您将使用不同类型声明此相同变量。如果可能,您应该找到由您实例化的两种类型共享的变量的抽象类型(例如MainHomePageMainAffittaAppartamenti),然后在if和{else之外声明它{1}}块和主方法范围。

例如,如果MainAffittaAppartamentiMainHomePage的子类,那么您可以这样做:

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仍然有效。