Java обращается к публичной переменной за пределами класса, SecurityException: мидлет не создан createMIDlet - PullRequest
4 голосов
/ 02 апреля 2012

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

Я получаю ошибку

    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.");
    }

    }

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

    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;
     }
    }

Ответы [ 3 ]

4 голосов
/ 02 апреля 2012

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

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

Java также является объектно-ориентированным, поэтому вам следует избегать доступа, как описано выше, и использовать несколько методов 'getter and setter':

public int getCounter() {
    return counter;
}

, а затем позвоните int counter = tungmidobj.getCounter();

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

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

0 голосов
/ 02 апреля 2012

в одну сторону это

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

но знать инкапсуляцию

во втором способе

вы можете сделать частную переменную counter и предоставить установщик и получатель.

private int counter;

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

public int getCounter(){
return counter;
}

Второй способ предпочтителен, так как он обеспечивает инкапсуляцию

...