2012-06-03 47 views
3

下面的代碼繼續給我:Java可以不是指非最終變量

無法指非最終變量textBoxPassword在一個不同的方法Login.java/ChurchWebLogin/SRC限定的內部類的內部/ COM/GWT/churchweb/churchweblogin /客戶端線61

package com.gwt.churchweb.churchweblogin.client; 

import com.google.gwt.user.client.ui.Composite; 
import com.google.gwt.user.client.ui.VerticalPanel; 
import com.google.gwt.user.client.ui.Label; 
import com.google.gwt.user.client.ui.FlexTable; 
import com.google.gwt.user.client.ui.TextBox; 
import com.google.gwt.user.client.ui.HasHorizontalAlignment; 
import com.google.gwt.user.client.ui.CheckBox; 
import com.google.gwt.user.client.ui.Button; 
import com.google.gwt.event.dom.client.ClickHandler; 
import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.user.client.Window; 

public class Login extends Composite { 

    public Login() { 

     VerticalPanel verticalPanel = new VerticalPanel(); 
     initWidget(verticalPanel); 
     verticalPanel.setSize("329px", "186px"); 

     Label lblNewLabel = new Label("Sign into your account"); 
     lblNewLabel.setStyleName("gwt-Login-SigninLabel"); 
     verticalPanel.add(lblNewLabel); 

     FlexTable flexTable = new FlexTable(); 
     verticalPanel.add(flexTable); 
     flexTable.setWidth("308px"); 

     Label lblNewLabel_1 = new Label("Username:"); 
     lblNewLabel_1.setStyleName("gwt-Label-Login"); 
     flexTable.setWidget(0, 0, lblNewLabel_1); 
     lblNewLabel_1.setWidth("72px"); 

     TextBox textboxUsername = new TextBox(); 
     textboxUsername.setStyleName("gwt-LoginTextBox"); 
     flexTable.setWidget(0, 1, textboxUsername); 
     textboxUsername.setWidth("204px"); 

     Label lblNewLabel_2 = new Label("Password:"); 
     lblNewLabel_2.setStyleName("gwt-Label-Login"); 
     flexTable.setWidget(1, 0, lblNewLabel_2); 
     lblNewLabel_2.setWidth("66px"); 

     TextBox textBoxPassword = new TextBox(); 
     textBoxPassword.setStyleName("gwt-LoginTextBox"); 
     flexTable.setWidget(1, 1, textBoxPassword); 
     textBoxPassword.setWidth("204px"); 
     flexTable.getCellFormatter().setHorizontalAlignment(0, 0, HasHorizontalAlignment.ALIGN_LEFT); 
     flexTable.getCellFormatter().setHorizontalAlignment(1, 0, HasHorizontalAlignment.ALIGN_LEFT); 

     CheckBox chckbxRememberMeOn = new CheckBox("Remember me on this computer"); 
     chckbxRememberMeOn.setStyleName("gwt-Checkbox-Login"); 
     flexTable.setWidget(2, 1, chckbxRememberMeOn); 

     Button btnSignIn = new Button("Sign In"); 
     btnSignIn.addClickHandler(new ClickHandler() { 
      public void onClick(ClickEvent event) { 
       if (textboxUsername.getText().length() == 0 
         || textBoxPassword.getText().length() == 0) { 
         Window.alert("Username or password is empty."); 
        } 
      } 
     }); 

     btnSignIn.setStyleName("gwt-Login-SigninButton"); 
     flexTable.setWidget(3, 1, btnSignIn); 



    } 


} 
+0

除了鏈接,'接受'是一種感謝那些幫助你的方式。點擊發布旁邊的向上箭頭是另一種方式。這個假設評論是有用的...... –

回答

5
final TextBox textboxUsername = new TextBox(); 

final TextBox textBoxPassword = new TextBox(); 

應該修復它。

Java需要將來自內部類的變量引用爲final變量(出於併發管理的原因,我想)。

+6

我總是儘管它與匿名類如何在JVM中編譯和執行有關,比如如果匿名函數的執行不能確定變量的實際值,因爲它沒有被檢索動態執行過程中,但在上一步,但它只是一個猜測.. – Jack

+0

它不只是匿名類;它是任何內部類。 –

+1

從內部類訪問非final字段是完全合法的,否則我的代碼的90%不會編譯;)當類是匿名的,因此在方法中聲明時出現問題.. – Jack

4

如果在內部類中使用局部變量,則必須聲明局部變量爲final。你應該寫:

final TextBox textBoxPassword = new TextBox(); 
1

匿名類的實例應該能夠訪問周邊範圍的本地 變量和參數。但是,一個實例可能會超出構建它的方法(作爲將實例的引用存儲在字段中的結果),並嘗試訪問局部變量和方法返回後不再存在的參數。

由於Java不允許這種非法訪問,這很可能會導致虛擬機器崩潰,所以它允許匿名類實例只訪問聲明爲最終的局部變量和參數 。當在一個匿名類實例遇到最終局部變量/參數 名,編譯器做的兩件事情之一:

  • 如果變量的類型是基本類型(int或double,例如),該 編譯器替換其名稱與變量的只讀值。
  • 如果變量的類型是參考(字符串,例如),編譯器 介紹,到類文件,存儲在所述合成的可變本地變量的/參數的 參考合成的變量(一個製造 變量)和代碼。