Passagem de parâmetros em chamadas de outra classe com main  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
turnes
HelloWorld
[Avatar]
Membro desde: 06/03/2003 00:55:21
Mensagens: 14
Offline

Olá, pessoal. O meu novo problema é o seguinte:
preciso executar este trecho de código abaixo, que chama um outro
arquivo que tb contém um main, ou seja, é como se um executável
chamasse outro.



O erro retornado é o seguinte: java.lang.ArrayIndexOutOfBoundsException.

Quando eu não passo parâmetros, ou seja, quando args.length é igual
a zero, tudo funciona legal. Já testei o código que recebe o nome do
arquivo por parâmetro em DOS e tb funcionou. O problema está nessa
passagem de parâmetro.

Não tenho idéia do que pode ser.
mlopes
JavaTeenager
[Avatar]

Membro desde: 18/11/2002 11:01:01
Mensagens: 163
Localização: Alemanha
Offline

Tente :



[]'s

Marco Lopes

----------------------------------------------------------
Pássaro que cedo madruga....
... porém o segundo rato é quem pega o queijo
----------------------------------------------------------
[Yahoo!] [MSN]
turnes
HelloWorld
[Avatar]
Membro desde: 06/03/2003 00:55:21
Mensagens: 14
Offline

Coloquei
String args[] = new String[1] e deu um erro do tipo:
java.lang.reflect.InvocationTargetException
mlopes
JavaTeenager
[Avatar]

Membro desde: 18/11/2002 11:01:01
Mensagens: 163
Localização: Alemanha
Offline

Ola,

Esse erro significa que exite algo de errado no método main da sua classe Novo.

Coloque:



E então copie aqui o erro para que a gente possa te ajudar.

[]'s

Marco Lopes

----------------------------------------------------------
Pássaro que cedo madruga....
... porém o segundo rato é quem pega o queijo
----------------------------------------------------------
[Yahoo!] [MSN]
Elvis.The.Pelvis
JavaGuru
[Avatar]

Membro desde: 18/12/2002 17:45:34
Mensagens: 220
Localização: Recife/PE
Offline

InvocationTargetException é lançada quando o método que sofreu reflexão lança uma exceção. Seu método main está lançando alguma exceção.

Se não fosse o C, até hoje estaríamos programando em BASI, PASAL e OBOL.
Elvis.The.Pelvis é Daniel Freitas
[Email] [WWW] [MSN]
turnes
HelloWorld
[Avatar]
Membro desde: 06/03/2003 00:55:21
Mensagens: 14
Offline

Pois é, o que eu não entendo é o seguinte:
se eu eliminar a passagem de parâmetros,
a linha de código args[0] = "nome do arquivo" ,
a outra classe funciona normalmente, porque ela tb recebe
entrada de dados direto do teclado, como no DOS, e não dá erro desse
jeito.

Eu acredito e tenho ceretza que o erro está nessa passagem de
parâmetros e como recebi esta instrução de outra pessoa, não sei o que
pode ser.

Já procurei instruções na net e não encontrei nada que pudesse resolver.

HELPE ME!!!!!!!!
dukejeffrie
Virtual Machine Man
[Avatar]

Membro desde: 21/08/2002 03:53:28
Mensagens: 661
Offline

Mas é exatamente o que o Elvis falou.

por acaso seu método main interno, vamos chamá-lo assim, lança exceção? Tente declará-lo assim:



Desse jeito dá pra descobrir se o pau foi aí. Aliás, lançar qq exception é trash, mantenha as exceptions discriminadas sempre.

ArrayIndexOutOfBounds pode significar que o seu primeiro parâmetro (args[0]) contém uma string nula, vazia, sei lá, o que não parece lógico e absolutamente nunca aconteceria numa chamada normal.

Vc pode pegar a causa da InvocationTargetException() com o método getCause();

Mas to achando estrando essa variavel args[]. Você não precisa dela, pode fazer assim:



[]s do duke!
[Email] [WWW] [MSN] [ICQ]
mlopes
JavaTeenager
[Avatar]

Membro desde: 18/11/2002 11:01:01
Mensagens: 163
Localização: Alemanha
Offline

Ola,

Eu fiz um pequeno teste, talvez ajude.



Agora o alvo:



[]'s

Marco Lopes

----------------------------------------------------------
Pássaro que cedo madruga....
... porém o segundo rato é quem pega o queijo
----------------------------------------------------------
[Yahoo!] [MSN]
dukejeffrie
Virtual Machine Man
[Avatar]

Membro desde: 21/08/2002 03:53:28
Mensagens: 661
Offline

hehehe... getTargetException(), e não getCause()... : )
[Email] [WWW] [MSN] [ICQ]
turnes
HelloWorld
[Avatar]
Membro desde: 06/03/2003 00:55:21
Mensagens: 14
Offline

Olá, pessoal.

Desculpe-me mlopes, mas o trecho de código que a princípio vc me
mandou, funionou. O que não percebi é que depois gerava um outro erro.
Na verdade é o seguinte. Estou fazendo um ambiente de apredizagem de
algoritmos (Projeto de Pesquisa pela faculdade) que deve compilar o que
o usuário escreve (a segunda classe que eu chamo é o compilador).
Quando eu compilo a primeira vez, beleza! Porém, depois dá o seguinte erro:

"Second call to constructor of static parser. You must either use
ReInit() or set the JavaCC option Static to false during parser generation."

Vocês podem me ajudar?
mlopes
JavaTeenager
[Avatar]

Membro desde: 18/11/2002 11:01:01
Mensagens: 163
Localização: Alemanha
Offline

Ola,

Não sei quais ferramentas vc está usando, mas a mensagem é clara. Vc deve checar se o Parser já foi inicializado, se já foi, ao invés de criar um novo, chame o método reInit. Se é que vc quer usar o Parser como sigleton. Se não, atribua falso. à essa opção do static.

A propósito, qual parser vc está usando ? Eu usei o JLex a muito tempo atrás.

[]'s

Marco Lopes

----------------------------------------------------------
Pássaro que cedo madruga....
... porém o segundo rato é quem pega o queijo
----------------------------------------------------------
[Yahoo!] [MSN]
turnes
HelloWorld
[Avatar]
Membro desde: 06/03/2003 00:55:21
Mensagens: 14
Offline

Olah..
Eu estou usando o gerador JavaCC. Ele gera tanto o analisador léxico
quanto o sintático. Agora estou implementando o analisador semântico,
que é a parte mais chatinha...

Mas voltando ao nosso assunto, como assim atribuir falso no static?
Não seria melhor eu destruir a classe depois que eu já utilizei? Pois o erro
é pq estou, no caso, chamando duas vezes o construtor.

[]'s,
mlopes
JavaTeenager
[Avatar]

Membro desde: 18/11/2002 11:01:01
Mensagens: 163
Localização: Alemanha
Offline

Bom,

Acredito que vc usa algo do tipo parser = TheParser(java.io.InputStream stream) . Vc deve então sempre checar se o seu parser é null. Se não for, chame TheParser.ReInit(java.io.InputStream stream).

Como eu não conheço bem o Javacc, não posso ajudar muito mais do q isso. Espero que funcione.

[]'s

Marco Lopes

----------------------------------------------------------
Pássaro que cedo madruga....
... porém o segundo rato é quem pega o queijo
----------------------------------------------------------
[Yahoo!] [MSN]
turnes
HelloWorld
[Avatar]
Membro desde: 06/03/2003 00:55:21
Mensagens: 14
Offline

Pois é, no JavaCC é diferente...
Você sabe como chamar um procedimento de uma classe já
instanciada?

O código a seguir não funciona!!!

dukejeffrie
Virtual Machine Man
[Avatar]

Membro desde: 21/08/2002 03:53:28
Mensagens: 661
Offline

Eu acredito que, ainda mais por vc estar gerando código, vc deveria usar um parser dinâmico (ou seja, setar, no JavaCC, a opção para static parser como false).

O target do ant que chama o javacc tem a opção static = true | false | yes | no

No Google Groups, achei uma thread com um cara que teve exatamente o mesmo problema que você. Um outro respondeu o seguinte:


You need to set the STATIC option to false, and delete the
ASCII_CharStream.java file so that it will be regenerated.

Add the line
options{STATIC=false;}
to the beginning of your grammar file.


Tomara que isso resolva!!

[]s
[Email] [WWW] [MSN] [ICQ]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team