2012-04-02 8 views
4

Я новичок в Java, и у меня небольшая проблема. Я хочу получить доступ к переменной в одном классе из другого. У меня есть три класса, и я хочу иметь доступ к переменной в основном классе, чтобы позволить мне читать массив.Java доступ к открытой переменной вне класса, SecurityException: MIDlet не создан createMIDlet

Ошибка я получаю

java.lang.SecurityException: MIDlet not constructed by createMIDlet 

Пожалуйста, смотрите пример ниже. Пожалуйста, имейте в виду, что они все в одном пакете.

package tungPackage; 

    import com.sun.lwuit.*; 
    import com.sun.lwuit.animations.CommonTransitions; 
    import com.sun.lwuit.events.ActionEvent; 
    import com.sun.lwuit.events.ActionListener; 
    import javax.microedition.midlet.MIDlet; 


    public class TungMidlet extends MIDlet implements ActionListener { 
    private Command  back    = new Command("Back"); 
    private Command  ok     = new Command("Ok"); 

    public ActionListener commandlistListener = new ActionListener() { 
     public void actionPerformed(ActionEvent cmd) { 

      // check which command cliked 
      if (cmd.getCommand() == back) { 

       // go back to previous form 
       mainForm.show(); 
      } else if (cmd.getCommand() == ok) { 

       // go forward 
      } 
     } 
    }; 

    private List    list; 
    private Form    mainForm; 
    private Label    promptLabel; 

    private housesClass houseClassObject = new housesClass(); 

    public int counter; //this is the variable I want to access in a class called calculate class object. 

    private int sumAmmt; 

    public TungMidlet tungMidletObject; 
    public calculateClass calculateClassObject; 



    public TungMidlet() { 
     Display.init(this); 
    } 
    private ActionListener applistListener = new ActionListener() { 
     public void actionPerformed(ActionEvent ae) { 

      if(list.getSelectedIndex()==0){ 

       counter++; 

       if (counter>5) 
       { 
        //check sum price. 
        sumAmmt = calculateClassObject.calculateSum(); 
        Dialog x = new Dialog("info"); 
        Label label = new Label("Maximum reached."); 
        Label label2 = new Label("Sum ammt = "+sumAmmt); 
        x.addComponent(label); 
        x.addComponent(label2); 
        x.addCommand(ok); 
        x.show(); 
       } 
       else 

       { 
        //calculate the price 
        String info = houseClassObject.randomHouse(); 
        Dialog x = new Dialog("info"); 
        Label label = new Label(info); 
        x.addComponent(label); 
        x.addCommand(ok); 
        x.show(); 
       } 

      } 
     } 
    }; 


    public void startApp() { 
     //calculateClassObject = new calculateClass(); 

     //sumAmmt = calculateClassObject.calculate(sumAmmt); 

     mainForm  = new Form("Investment Categories"); 
     promptLabel = new Label("choose category"); 

     list = new List(); 
     list.addItem("House"); 
     list.addItem("Cars"); 
     list.addItem("Schools"); 
     list.addItem("Schools"); 
     list.addItem("Supermarkets"); 
     list.addItem("Stocks"); 
     list.addItem("Land"); 

     list.addActionListener(applistListener); 

     mainForm.addComponent(promptLabel); 
     mainForm.addComponent(list); 
     mainForm.addCommand(back); 
     mainForm.addCommandListener(commandlistListener); 
     mainForm.setTransitionInAnimator(CommonTransitions.createSlide(CommonTransitions.SLIDE_HORIZONTAL, true, 1000)); 
     mainForm.show(); 
    } 

    public void pauseApp() {} 

    public void destroyApp(boolean unconditional) {} 


    public void actionPerformed(ActionEvent ae) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    } 

Класс, по которому я хочу получить доступ к переменной счетчика, показан ниже.

package tungPackage; 

    import java.util.Random; 


    public class housesClass { 
    public Random generator = new Random(); 
    public String[] houseArray = new String[5]; 
    public housesClass housesClassObject; 

    public calculateClass calcobj;// = new calculateClass(); 

    public housesClass() 
     { 
     } 

    public String randomHouse() { 

     housesClassObject = new housesClass(); 

     houseArray[0] = "Bungalow - 20,000,000 Shillings"; 
     houseArray[1] = "Microhouse - 10,000,000 Shillings"; 
     houseArray[2] = "Flat - 200,000,000 shillings"; 
     houseArray[3] = "Garage apartment - 7,000,000 shillings"; 
     houseArray[4] = "Studio apartment - 13,000,000 shillings"; 

     int rnd = generator.nextInt(houseArray.length); 

     housesClassObject.housePrices(rnd);///noma 

     String house = houseArray[rnd]; 

     return house; 
    } 
    void housePrices(int houseNumber) { 
    calcobj = new calculateClass(); 
    TungMidlet tungmidobj = new TungMidlet(); 
    int counter = tungmidobj.counter; 
    int[] housePriceArray = new int[5]; 
    housePriceArray[0] = 20000000; 
    housePriceArray[1] = 10000000; 
    housePriceArray[2] = 200000000; 
    housePriceArray[3] = 7000000; 
    housePriceArray[4] = 13000000; 

    int price = housePriceArray[houseNumber]; 

    calcobj.storePrice(counter,price); 
    } 
    } 

Следующий вспомогательный класс показан ниже.

 package tungPackage; 

    public class calculateClass { 
    int[] storeArray = new int[5]; 



    public calculateClass() 
    { 
    } 

    public void storePrice(int counter, int number2) 
    { 
    storeArray[counter] = number2;  
    } 

    public int calculateSum() 
    { 
      int sum =0; 

      for(int i=1; i<6; i++){ 
       sum= sum+storeArray[i]; 
     } 
      return sum; 
    } 
    } 
+1

В чем проблема с тобой? Пожалуйста, разместите сообщение об ошибке или другое описание того, почему то, что вы делаете сейчас, терпит неудачу. –

+0

@ Keith Error - возникла внутренняя ошибка приложения: java.lang.SecurityException: MIDlet не создан createMIDlet « – sammyukavi

ответ

3
  1. удалить TungMidlet конструктор. Если бы там было что-то полезное, вы также могли бы объявить его защищенным, но это не относится к вашему фрагменту кода, см. Ниже.
    Где бы вы ни пытались вызвать этот конструктор напрямую, удалите код, который делает это, и найдите другой способ сделать то, что вам нужно. При необходимости примеры примеров кода приведены в LWUIT Tutorial - Introduction, поскольку типичные вещи выполняются в LWUIT.
  2. заявление положить Display.init() в начале метода startApp,
    так же, как это делается в LWUIT Tutorial - Hello, LWUIT! пример кода

Причина, почему вы получаете SecurityException потому, что вы вызываете TungMidlet конструктор напрямую. Не делайте этого.

+0

Wow !!! Спасибо чувак!!! оно работает. – sammyukavi

+2

Также удалите UnsupportedOperationException, он компилируется, но не работает на большинстве устройств. Его ошибка в WTK, которая позволяет ее компилировать. –

4

Вы получаете сообщение об ошибке? Похоже, ваш код доступа должен работать.

Я не могу найти нигде, что вы на самом деле инициализируете счетчик, хотя, возможно, ваша проблема в том, что вам нужно поставить counter = 0; где-нибудь в вашем коде.

Java также объектно-ориентированный язык, так что вы должны избегать доступа, как выше и сделать некоторые «геттер и сеттер» методы:

public int getCounter() { 
    return counter; 
} 

, а затем называют int counter = tungmidobj.getCounter();

+0

@ Dan, я пробовал ваш код, но продолжает показывать ту же ошибку. – sammyukavi

+1

Является ли это java.lang. SecurityException: MIDlet не создан с помощью createMIDlet' сверху? Я сомневаюсь, что ошибка имеет какое-либо отношение к доступу к счетчику. Возможно, это поможет - http://justanapplication.wordpress.com/2009/09/11/midlet-not-constructed- by-createmidlet /? –

+0

Спасибо, человек ... Я понял. – sammyukavi

0

один путь

TungMidlet tungMidlet=new TungMidlet(); 
System.out.println(tungMidlet.counter); 

но знаете encapsulation

второй способ

вы можете сделать счетчик частной переменной и предоставить сеттер и геттеры.

private int counter; 

public void setCounter(int counter){ 
this.counter=counter; 
} 

public int getCounter(){ 
return counter; 
} 

Второй способ предпочтительным способом, как он достигает encapsulation

+0

чувак, извините, не мог понять ваш c ода. похоже, что у меня есть некоторые ошибки. у вашей пустоты есть возврат? – sammyukavi

+0

отредактировал tx для указания –