Erro ao acessar classe com códigos RMS

16 respostas
J

Olá pessoal, eu criei uma classe chamada Banco.java onde criei métodos para persistência de dados em RMS (até ai tudo bem). O problema se da quando eu tento acessar da minha classe Despesas.java os métodos da classe Banco.java. Segue a baixo as classes Despesas.java, Banco.java e o erro q da no WTK:

Classe Despesas.java // vá até a condição if(c==this.inserirRMS)

public void commandAction(Command c, Displayable d){

       if(d==principal){
         if(c==this.acessar){
            adm = new Admin();
             if(camposenha.getString().equals(adm.getSenha())){
                this.ticker = new Ticker("Senha correta!!!");
                this.tela.setCurrent(this.index);
               }else{
                     this.ticker = new Ticker("Senha incorreta!!!");
                     this.principal.setTicker(this.ticker);
                }
         }
         if(c==this.sair){
            this.destroyApp(true);
            this.notifyDestroyed();
         }
       }
       if(d==index){
          if(c==this.voltar){
            this.tela.setCurrent(this.principal);
          }
          if(c==this.inserirD){
              this.tela.setCurrent(this.insere);
          }
          if(c==this.listarD){

          }
       }
       if(d==insere){
          if(c==this.voltarIndex){
             this.tela.setCurrent(this.index);
          }
          if(c==this.inserirRMS){  <-- Pq quando clico nesse botão da ERRO? 
                      banco = new Banco();
                      banco.conectaBanco();
                      banco.gravaDado("Jaison");
                      banco.leDado();
          }
       }
    }

Classe Banco.java

import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.rms.*;

public class Banco extends MIDlet{

private RecordStore rs = null;
static final String nomeBanco = "db_1";

public Banco(){    
}

public void startApp(){
       // There is no user interface, go ahead and shutdown
       destroyApp(false);
       notifyDestroyed();
}
public void pauseApp(){
}

public void destroyApp( boolean unconditional ){
}

public void conectaBanco(){
try{
    // Create record store if it does not exist
    rs = RecordStore.openRecordStore(nomeBanco, true );
    }catch(Exception e){
    db(e.toString());
    }
}

public void fechaBanco(){
try{
    rs.closeRecordStore();
    }catch (Exception e){
    db(e.toString());
    }
}

public void apagaBanco(){
       if (RecordStore.listRecordStores() != null){
       try{
           RecordStore.deleteRecordStore(nomeBanco);
           }catch (Exception e){
           db(e.toString());
           }
       }
}

public void gravaDado(String dados){
       byte[] dado = dados.getBytes();
       try{
       rs.addRecord(dado, 0, dado.length);
       }
       catch (Exception e){
       db(e.toString());
       }
}

public void leDado(){
       try{
       byte[] recData = new byte[50];
       int len;
       for (int i = 1; i <= rs.getNumRecords(); i++){
           len = rs.getRecord( i, recData, 0 );
           System.out.println("Record #" + i + ": " + new String(recData, 0, len));
           System.out.println("------------------------------");
       }
       }catch (Exception e){
       db(e.toString());
       }
}

private void db(String str){
        System.err.println("Msg: " + str);
}
}

WTK erro!

java.lang.SecurityException: Application not authorized to access the restricted API
	at com.sun.midp.security.SecurityToken.checkIfPermissionAllowed(+40)
	at com.sun.midp.security.SecurityToken.checkIfPermissionAllowed(+7)
	at com.sun.midp.midletsuite.MIDletSuiteImpl.checkIfPermissionAllowed(+8)
	at com.sun.midp.midlet.MIDletState.<init>(+78)
	at javax.microedition.midlet.MIDletProxy.<init>(+5)
	at javax.microedition.midlet.MIDlet.<init>(+13)
	at Banco.<init>(+4)
	at Despesas.commandAction(+212)
	at javax.microedition.lcdui.Display$DisplayAccessor.commandAction(+282)
	at javax.microedition.lcdui.Display$DisplayManagerImpl.commandAction(+10)
	at com.sun.midp.lcdui.DefaultEventHandler.commandEvent(+68)
	at com.sun.midp.lcdui.AutomatedEventHandler.commandEvent(+47)
	at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.run(+250)

16 Respostas

BrunoBastosPJ

tira essas linhas da tua classe banco

public void startApp(){
       // There is no user interface, go ahead and shutdown
       destroyApp(false);
       notifyDestroyed();
}
public void pauseApp(){
}

public void destroyApp( boolean unconditional ){
}

e tenta

J

o erro continua Bruno :frowning:

BrunoBastosPJ

cola ai o codigo da classe despesas para eu testar aki

J

segue abaixo as duas classes do meu projeto bruno, abraço, e desde já lhe agradeço pela atenção

Despesas.java

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Despesas extends MIDlet implements CommandListener{

       Display tela;
       Ticker ticker;
       Form principal, index, insere;
       TextField camposenha, camponome, campodata, campovalor;
       Command acessar, sair, voltar, inserirD, listarD, configDV, salvaArq, removerD, inserirRMS, voltarIndex;
       Admin adm;
       Banco banco;

public Despesas(){

       // instanciar Forms
       this.principal = new Form ("DV 1.0");
       this.index = new Form ("Despesas de viagem");
       this.insere = new Form("Inserir Despesa");
       // comandos do Forms
       this.camposenha = new TextField("Senha: ","",5, TextField.NUMERIC | TextField.PASSWORD);
       this.camponome = new TextField("Nome: ","",15,TextField.ANY);
       this.campodata = new TextField("Data: ","",10,TextField.ANY);
       this.campovalor = new TextField("Valor: ","",10,TextField.DECIMAL);
       this.acessar = new Command("Acessar", Command.OK, 0);
       this.sair = new Command("Sair",Command.EXIT,0);
       this.voltar = new Command("Voltar", Command.BACK, 0);
       this.voltarIndex = new Command("Voltar", Command.BACK, 0);
       this.inserirRMS = new Command("Inserir",Command.OK,0);
       //Dados do MENU
       this.inserirD = new Command("Inserir Despesa",Command.SCREEN,1);
       this.removerD = new Command("Remover Despesa",Command.SCREEN,2);
       this.listarD = new Command("Listar Despesas",Command.SCREEN,3);
       this.configDV = new Command("Configurações",Command.SCREEN,4);
       this.salvaArq = new Command("Salvar em Arquivo",Command.SCREEN,5);
       //configuração da imagem
       Image fundo = null;
       try{
       fundo = Image.createImage("/fundoCel.gif");
       }catch (java.io.IOException ex){
       System.out.println("Excessão: " + ex);
       }
       ImageItem img = new ImageItem("", fundo, ImageItem.LAYOUT_CENTER, "Fundo");
       // relacionar Commands com Form
       this.principal.append(camposenha);
       this.insere.append(camponome);
       this.insere.append(campodata);
       this.insere.append(campovalor);
       this.index.append(img);
       this.principal.addCommand(acessar);
       this.principal.addCommand(sair);
       this.index.addCommand(voltar);
       this.index.addCommand(inserirD);
       this.index.addCommand(removerD);
       this.index.addCommand(listarD);
       this.index.addCommand(configDV);
       this.index.addCommand(salvaArq);
       this.insere.addCommand(inserirRMS);
       this.insere.addCommand(voltarIndex);
       // registrar Form, com o CommandListener
       this.principal.setCommandListener(this);
       this.index.setCommandListener(this);
       this.insere.setCommandListener(this);
}

public void startApp(){

       // obter tela do dispositivo
       this.tela = Display.getDisplay(this);
       // setar Displayable corrente para a tela
       this.tela.setCurrent(this.principal);
}

public void pauseApp(){
}

public void destroyApp(boolean i){
}
       //aqui precisamos de um command e um displayable
       //o displyable será o componente ativo na tela
       //porque ele extende de Display

public void commandAction(Command c, Displayable d){

       if(d==principal){
         if(c==this.acessar){
            adm = new Admin();
             if(camposenha.getString().equals(adm.getSenha())){
                this.ticker = new Ticker("Senha correta!!!");
                this.tela.setCurrent(this.index);
               }else{
                     this.ticker = new Ticker("Senha incorreta!!!");
                     this.principal.setTicker(this.ticker);
                }
         }
         if(c==this.sair){
            this.destroyApp(true);
            this.notifyDestroyed();
         }
       }
       if(d==index){
          if(c==this.voltar){
            this.tela.setCurrent(this.principal);
          }
          if(c==this.inserirD){
              this.tela.setCurrent(this.insere);
          }
          if(c==this.listarD){

          }
       }
       if(d==insere){
          if(c==this.voltarIndex){
             this.tela.setCurrent(this.index);
          }
          if(c==this.inserirRMS){
                      banco = new Banco();
                      banco.conectaBanco();
                      banco.gravaDado("aaa");
                      banco.leDado();
          }
       }
    }
}//fecha despesas.java

Banco.java

import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.rms.*;

public class Banco extends MIDlet{

private RecordStore rs = null;
private String nomeBanco = "db_1";

public Banco(){

       // conectaBanco(); Abri ou cria um record store
       // gravaDado("Jaison"); //Grava string no banco
       // gravaDado("Wireless Technology"); Grava string no banco
       // leDado(); //lê strings
       // fechaBanco(); // fecha banco
       // apagaBanco(); // remove o banco
}

public void startApp(){
// There is no user interface, go ahead and shutdown
destroyApp(false);
notifyDestroyed();
}
public void pauseApp(){
}

public void destroyApp( boolean unconditional ){
}

public void conectaBanco(){
try{
    // Create record store if it does not exist
    rs = RecordStore.openRecordStore(nomeBanco, true );
    }catch(Exception e){
    db(e.toString());
    }
}

public void fechaBanco(){
try{
    rs.closeRecordStore();
    }catch (Exception e){
    db(e.toString());
    }
}

public void apagaBanco(){
       if (RecordStore.listRecordStores() != null){
       try{
           RecordStore.deleteRecordStore(nomeBanco);
           }catch (Exception e){
           db(e.toString());
           }
       }
}

public void gravaDado(String dados){
       byte[] dado = dados.getBytes();
       try{
       rs.addRecord(dado, 0, dado.length);
       }
       catch (Exception e){
       db(e.toString());
       }
}

public void leDado(){
       try{
       byte[] recData = new byte[50];
       int len;
       for (int i = 1; i <= rs.getNumRecords(); i++){
           len = rs.getRecord( i, recData, 0 );
           System.out.println("Registro #" + i + ": " + new String(recData, 0, len));
           System.out.println("------------------------------");
       }
       }catch (Exception e){
       db(e.toString());
       }
}

private void db(String str){
        System.err.println("Msg: " + str);
}
}
BrunoBastosPJ

que classe Admin é essa?

J

é onde eu tenhu uma senha setada, mas se o meu RMS funcionar dae vou validar via RecordStore

BrunoBastosPJ

sim sim, mas é estranho porque o que você está usando não era para dar esse erro de restrited API, já vi acontecendo quando se usa MIDlet. Por acaso essa classe Admin herda MIDlet? Eu queria testar seu código aqui, porque não vi nenhum erro que possa dar essa exceção com o código que você postou. Para testar preciso dessa classe Admin hehehe

J

Obrigado pela sua atenção!

Classe Admin.java

public class Admin {

       private String nome;
       private String senha;

    public Admin() {
       setSenha("12345");
    }

    public java.lang.String getNome() {
        return nome;
    }

    public void setNome(java.lang.String value) {
        nome = value;
    }

    public java.lang.String getSenha() {
        return senha;
    }

    public void setSenha(java.lang.String value) {
        senha = value;
    }

}
K

O problema está no

if(c==this.inserirRMS){
                      banco = new Banco();
                      banco.conectaBanco();
                      banco.gravaDado("aaa");
                      banco.leDado();
          }

Porque a classe Despesas herda de MIDLet e a class Banco também e a construção de um MIDlet que não for pelo sistema gera um Security Exception

J

“kamyu2881”:
O problema está no

if(c==this.inserirRMS){
                      banco = new Banco();
                      banco.conectaBanco();
                      banco.gravaDado("aaa");
                      banco.leDado();
          }

Porque a classe Despesas herda de MIDLet e a class Banco também e a construção de um MIDlet que não for pelo sistema gera um Security Exception


protected MIDlet()

Protected constructor for subclasses. The application management software is responsible for creating MIDlets and creation of MIDlets is restricted. MIDlets should not attempt to create other MIDlets.

Throws:
SecurityException - unless the application management software is creating the MIDlet.

Certo kamyu2881, também ja estava desconfiado, mas como resolvo esse problema?

forte abraço.

K

Bem eu não vi necessidade alguma da classe Banco ter que estender de MIDlet por mim eu tirava a herança de MIDlet e os métodos(startApp,pauseApp,destroyApp).

J

já fiz isso kamyu, mas da esse erro quando eu carrego o meu projeto no Midlet

erro q ta no console do WTK:

Project "Despesas" loaded
Running with storage root DefaultColorPhone
Running with locale: Portuguese_Brazil.1252
Error verifying method Despesas <init>()V
Approximate bytecode offset 268: Inconsistent or missing stackmap at target
Method............: 1018b3f8 'com/sun/midp/midlet/MIDletState.createMIDlet (static)' 
Stack Chunk.......: e013fc

Frame Pointer.....: e01454
Current IP........: 10223e61 = 10223e44 + offset 29
Previous Frame....: e0141c
Previous IP.......: 1024d539 (offset 22)
Frame size........: 7 (1 arguments, 6 local variables)
Argument[0].......: e01c5c
Local[1]..........: 0
Local[2]..........: e5bd9c
Local[3]..........: e03cbc
Local[4]..........: e5bdb0
Local[5]..........: 101747dc
Local[6]..........: e5bd7c
Operand[1]........: e79a00

Method............: 101a574c 'com/sun/midp/midlet/Selector.run (virtual)' 
Stack Chunk.......: e013fc
Frame Pointer.....: e0141c
Current IP........: 1024d539 = 1024d523 + offset 22
Previous Frame....: 0
Previous IP.......: 1
Frame size........: 6 (1 arguments, 5 local variables)
Argument[0].......: e01de8
Local[1]..........: e03d98
Local[2]..........: e01c5c
Local[3]..........: 0
Local[4]..........: 0
Local[5]..........: 0
Operand[1]........: e03d98

VM status:
Instruction pointer.: 10223e61 (offset within invoking method: 29)
Next instruction....: 0x4c
Frame pointer.......: e01454
Local pointer.......: e01438
Stack size..........: 128; sp: e0146c; ranges: e01404-e01604;
Contents of the current stack frame:
    e01438: e01c5c (lp)
    e0143c: 0
    e01440: e5bd9c
    e01444: e03cbc
    e01448: e5bdb0
    e0144c: 101747dc
    e01450: e5bd7c
    e01454: e0141c (fp)
    e01458: 1024d539
    e0145c: e01434
    e01460: 1018b3f8
    e01464: e013fc
    e01468: 0 (end of frame)
    e0146c: e79a00 (sp)
Execution stack contains 108 items: 
e01de8  
ALERT: java/lang/VerifyError: Despesas.

e03d98  
e01c5c  
0  
0  
0  
0  
1  
e5bd80  
101a574c  
e013fc  
0  
e03d98  
e01c5c  
0  
e5bd9c  
e03cbc  
e5bdb0  
101747dc  
e5bd7c  
e0141c  
1024d539  
e01434  
1018b3f8  
e013fc  
0  
e79a00  

Execution completed.
894938 bytecodes executed
9 thread switches
895 classes in the system (including system classes)
4559 dynamic objects allocated (127128 bytes)
3 garbage collections (108564 bytes collected)
Execution completed.
894938 bytecodes executed
9 thread switches
895 classes in the system (including system classes)
4559 dynamic objects allocated (127128 bytes)
3 garbage collections (108564 bytes collected)
K

Estranho eu já esse tipo erro uma vez em aplicação não pré-verificada mas isso não acontece quando se roda pelo WTK, manda o código do ponto em que vc alterou para ver se ajuda a descobir o que ocorreu.

J

alterei apenas a classe Banco.java

import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.rms.*;

public class Banco{

private RecordStore rs = null;
private String nomeBanco = "db_1";

public Banco(){

       // conectaBanco(); Abri ou cria um record store
       // gravaDado("Jaison"); //Grava string no banco
       // gravaDado("Wireless Technology"); Grava string no banco
       // leDado(); //lê strings
       // fechaBanco(); // fecha banco
       // apagaBanco(); // remove o banco
}

public void conectaBanco(){
try{
    // Create record store if it does not exist
    rs = RecordStore.openRecordStore(nomeBanco, true );
    }catch(Exception e){
    db(e.toString());
    }
}

public void fechaBanco(){
try{
    rs.closeRecordStore();
    }catch (Exception e){
    db(e.toString());
    }
}

public void apagaBanco(){
       if (RecordStore.listRecordStores() != null){
       try{
           RecordStore.deleteRecordStore(nomeBanco);
           }catch (Exception e){
           db(e.toString());
           }
       }
}

public void gravaDado(String dados){
       byte[] dado = dados.getBytes();
       try{
       rs.addRecord(dado, 0, dado.length);
       }
       catch (Exception e){
       db(e.toString());
       }
}

public void leDado(){
       try{
       byte[] recData = new byte[50];
       int len;
       for (int i = 1; i <= rs.getNumRecords(); i++){
           len = rs.getRecord( i, recData, 0 );
           System.out.println("Registro #" + i + ": " + new String(recData, 0, len));
           System.out.println("------------------------------");
       }
       }catch (Exception e){
       db(e.toString());
       }
}

private void db(String str){
        System.err.println("Msg: " + str);
}
}
K

Bem com os 3 arquivos(Despesas.java,Admin.java e o novo Banco.java) eu criei um projeto no WTK 2.3 compilei e rodei perfeitamente,portanto eu não sei o que pode estar causando aquele erro.

J

Obrigado Kamyu! Criei um novo projeto e funfo, num sei oq deu no WTK :lol:

Criado 14 de agosto de 2006
Ultima resposta 17 de ago. de 2006
Respostas 16
Participantes 3