Runtime, aonde estou errando?

10 respostas
Jexploitech

Boa Noite (Madrugada) Pessoal.....como vão??
Desculpem o incomodo, mas pela segunda vzs venho pedir a ajuda de vcs :oops: !!!
Na verdade busquei / pesquisei em tudo quanto é lugar (uns 4 dias), achei mtas coisas sobre Runtime, mas não consegui fazer 1 funcionar dentro do meu código :shock: !!!

a coisa eh: Gostaria de executar um problema (batch) que está na mesma pasta do .class... um arquivo chamado executavel.bat ou um comando do DOS. (A calculadora em sí funciona normalmente)...

usei as linhas a abaixo:

Process executa = Runtime.getRuntime().exec("executavel.bat");

ou (a linha que eu acho mais interessante usar pela objetividade)...

Process executa = Runtime.getRuntime().exec("cmd /c cls");

Mas aparece o bendito erro:

[color=red]Unreported exception java.io.IOException; must be caught or declared to be thrown[/color]

Então segui as instruções do NetBeans, cliquei numas instruções e ele add algumas linhas try-catch, mas ñ adiantou nada =\...os erros sumiram mas não foi executado o executavel.bat O.O"!!!

Me parece que ele pede para declarar alguma coisa com relação a classe IOException neh, ou estou errado :oops: ???

A propósito, vocês me recomendam usar: BufferedReader + InputStreamReader + IOException........ou Scanner para entrada de dados??? (eu optei pelo Scanner por ser tb mais objetivo O.o")....no entanto ñ se usa o try-catch neh!!!

Desde jah, Fico Grato por qualquer luz \o/!!!

Abraços!

o código inteiro eh esse:

package calculadoras;


import java.util.Scanner;
import java.io.IOException;

public class CalcKonsole {


				public static void main(String[] args){ /*na verdade aqui seria "public static void CKonsole()" porque tem outros tipos de Calcs junto, mas voltei pro main(String[] args) pra facilitar pra vcs \o/ */
					
					int op;
					
					do {
					
					Scanner escolhe = new Scanner(System.in);
            
                                    
                    System.out.print("\n§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§");
					System.out.print("\n§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§\n");
					
                    System.out.println(" \nEntre com a Operacao Desejada: (Ou Digite 5 para sair) \n\n");
					System.out.println(" [1]Adicao\n\n [2]Subtracao\n\n [3]Multiplicacao\n\n [4]Divicao\n\n");
					
                    System.out.print("§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§\n");
					System.out.print("§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§\n");
					
					op = escolhe.nextInt();
					


                  /*AQUI*/   Process p = Runtime.getRuntime().exec("cmd /c cls");  /* O ERRO: Unreported exception java.io.IOException; must be caught or declared to be thrown */


                                        
					switch(op) {
					
					case 1 : new CalcKonsole().somar();       break;
					case 2 : new CalcKonsole().subtrair();    break;
					case 3 : new CalcKonsole().multiplicar(); break;
					case 4 : new CalcKonsole().dividir();     break;
								 }
					
						} while(op != 5);
				
				}

	public void SOMA(){
	somar();
	}
	public void SUBTRACAO(){
	subtrair();
	}
	public void MULTIPLICAO(){
	multiplicar();
	}
	public void DIVISAO(){
	dividir();
	}
	
			private void somar(){
				
				Scanner num1 = new Scanner(System.in);
				Scanner num2 = new Scanner(System.in);
				System.out.print(" Entre com o primeiro valor : ");
				float n1 = num1.nextFloat();
				System.out.print(" Entre com o segundo valor : ");
				float n2 = num2.nextFloat();
				
				System.out.println(" \n\nResultado da Adicao : " + (n1+n2));
     		}

			private void subtrair(){
				
				Scanner num1 = new Scanner(System.in);
				Scanner num2 = new Scanner(System.in);
				
				System.out.print(" Entre com o primeiro valor : ");
				float n1 = num1.nextFloat();
				System.out.print(" Entre com o segundo valor : ");
				float n2 = num2.nextFloat();
				
				System.out.println(" \n\nResultado da Subtracao : " + (n1-n2));
			}
			
			private void multiplicar(){
				
				Scanner num1 = new Scanner(System.in);
				Scanner num2 = new Scanner(System.in);
				
				System.out.print(" Entre com o primeiro valor : ");
				float n1 = num1.nextFloat();
				System.out.print(" Entre com o segundo valor : ");
				float n2 = num2.nextFloat();
				
				System.out.println(" \n\nResultado da Multiplicacao : " + (n1*n2));
			}
			
			private void dividir(){
				
				Scanner num1 = new Scanner(System.in);
				Scanner num2 = new Scanner(System.in);
				
				System.out.print(" Entre com o primeiro valor : ");
				float n1 = num1.nextFloat();
				System.out.print(" Entre com o segundo valor : ");
				float n2 = num2.nextFloat();
				
				if(n2 == 0){
							  System.out.println(" \n\nNAO EXISTE DIVISAO POR ZERO.");
							  }
							  else{
								    System.out.println(" \n\nResultado da Divisao : " + (n1/n2));
									}
			}

}

10 Respostas

E

Jexploitech o problema é que na linha do runtime pode ocorrer um exceção. Então você deve ou lançar a exceção ou tratá-la.
Você disse que tinha utilizado o bloco try-catch, mas o que você fez no bloco catch? Para não perder a exceção, tente adiciona dentro dele a mensagem de erro. Exemplo:

try {
 Process executa = Runtime.getRuntime().exec("executavel.bat");  
} catch (IOException e) {
 e.printStackTrace(); //Se ocorrer alguma execeção, então ela será impressa no console
}

Bons estudos.

luxu
fiz assim:
public static void fazBackup()
	  {
	  DateTime cal = new DateTime();
	  int dia = cal.getDayOfMonth();
	  int mes = cal.getMonthOfYear();
	  int ano = cal.getYear();
	  String snh = ""; 
	  String banco ="studio";
	  File diretorio = new File("D:/SDO-Backup");
	  File arquivo = new File("D:/SDO-Backup/bkp_"+banco+"_"+ano+"_"+mes+"_"+dia+".sql");
	  Boolean snbkp = true;
	  // Cria diretório
	  if(!diretorio.isDirectory()) new File("D:/SDO-Backup").mkdir();
	  // Cria Arquivo de Backup
	  try {
	  	  if (arquivo.isFile()){ 
			  if(JOptionPane.showConfirmDialog(null,"Ja foi criado backup hoje, deseja substituir ?","Backup ja existe",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE)==JOptionPane.YES_OPTION)
			  { 
				  arquivo.delete();
				  snbkp = true;
			  }
			  else
			  {
				  snbkp = false;
			  } 
		  }
		  	  
		  if(snbkp==true)
		  { 
			String comando = "C:\\Program Files (x86)\\MySQL\\MySQL Server 5.1\\bin\\mysqldump";
			ProcessBuilder pb = new ProcessBuilder(comando, "--user=root",
					"--password="+snh, banco, "--result-file=D:\\SDO-Backup\\bkp_" +banco+"_"+ano+
					  "_"+mes+"_"+dia+".sql");
			pb.start();
			int res = 0;
		  
		  if (res == 0)
			  JOptionPane.showMessageDialog(null,"Backup criado com Sucesso !");
		  else 	{
			  JOptionPane.showMessageDialog(null,"Falha ao criar Backup. \n Verifique as configurações ou entre em contato com o suporte !",
					  "Erro ao criar backup", JOptionPane.ERROR_MESSAGE);
		  	  } 
		  }
	  }
	  catch (IOException ex) {
		  ex.printStackTrace();
		  System.out.println(ex); 
		  JOptionPane.showMessageDialog(null,"Erro na criação do Backup !");
	  } catch(Exception err){
		  System.out.println(err);
		  JOptionPane.showMessageDialog(null,"Erro na criação do Backup !");
	  }
	  
}

e funciona q é uma maravilha o meu backup...

A

haha, adorei um trecho do código que dei uma olhada rápida ^^

int res = 0;  
           
if (res == 0)  
    JOptionPane.showMessageDialog(null,"Backup criado com Sucesso !");  
else  {  
    JOptionPane.showMessageDialog(null,"Falha ao criar Backup. \n Verifique as configurações ou entre em contato com o suporte !",  
         "Erro ao criar backup", JOptionPane.ERROR_MESSAGE);  
}
Jexploitech

Boa Madrugada novamente pessoal...como vão?

então...obrigado a todos pelos retornos!

EAugusto, achei essa sua forma mais interessante, por usar justamente esse Runtime....
mas ainda não funcionou =\...e ainda testei individualmente do meu código....fiz assim:

import java.io.*;

public class AbreExecutavel {

public static void main(String[] args){

try {  

Process executa = Runtime.getRuntime().exec("C:\\Documents and Settings\\Administrador\\Desktop\\Nova pasta/executa.bat");    

} catch (IOException e) {  

e.printStackTrace(); //Se ocorrer alguma execeção, então ela será impressa no console  

} 

}

}

E Tambem fiz:

import java.io.*;

public class AbreExecutavel {

public static void main(String[] args){

try {  

Process executa = Runtime.getRuntime().exec("executa.bat");    /* Sem o caminho completo do diretorio, pq o .class tah na mesma pasta do executa.bat */

} catch (IOException e) {  

e.printStackTrace(); //Se ocorrer alguma execeção, então ela será impressa no console  

} 

}

}

Ele compila normalmente, sem erros, mas qdo vou executar...nada acontece =\!!!

meu arquivo executa.bat tem a seguinte instrução:

@echo off
echo.
echo.
echo.
echo.
echo Abrindo Bloco de Notas...
echo.
echo.
echo.
notepad.exe
echo.
echo.
cls
pause> nul
exit

Esse BAT abre o bloco de notas, mas qdo eu executo o programa java, ele executa e finaliza e o bloco de notas ñ abre =\!!!

então EAugusto, os bloco try-catch que eu coloquei foram justamente os que o NetBeans fornece automaticamente, quando aparece algum erro, ele dah dicas neh, ai cliquei, ele add varias coisas, e mesmo assim, nada!!! =\

Desculpa o incomodo pessoal!!!

Abraços!!!

A

certo, agora me sinto tb responsável na missão de fazer funga essa bagaça :smiley:

faz “uma” alteração: coloca no C: esse bat, altera o texto do runtime para: “cmd /c C:\executa.bat”, adiciona mais algum texto na exceção, e posta aqui o que escreveu depois de executar.

edit: Tem que mencionar que pra executar os arquivos pelo programa padrão do windows, se usa o “cmd /c”,
Outro problema que poderia ter acontecido é os espaços dos diretórios sem estar entre aspas na execução, o ideal dae seria ““c:\meu diretorio com espacos\meu arquivo blah.txt””

Off.: uma busca rápida conseguiria obter essas respostas mais rápida.

Jexploitech

Boa Madrugada pessoal \o/!!!
desculpa ñ ter respondido antes, mas tive alguns problemas de saude! (ainda estou meio ruim)!!!

ArrancaToco, obrigado pela dica, mas ainda esta acontecendo o mesmo problema…ele compila, executa, mas nada acontece…
alterei o diretório tb…

de “cmd /c C:\executa.bat” para “cmd /c executa.bat” que é aonde o arquivo tb estah, junto com o .class, e no diretorio C:.

esse código funciona com vc???

vou deixar o código que eu compilei aqui, cujo não mostra erros, executa, mas não o batch ñ entra em ação!

import java.io.*;

public class AbreExecutavel {

public static void main(String[] args){

try {  

Process executa = Runtime.getRuntime().exec("cmd /c C:\\executa.bat");    

} catch (IOException e) {  

e.printStackTrace(); //Se ocorrer alguma execeção, então ela será impressa no console  

} 

}

}

Obrigado pela força novamente…
estarei pesquisando mais sobre…

Abraços!

H

Bom Dia!

Estive notando que, com o comando “cmd /c start teste.bat” ele funciona, mas abre o bat em uma tela nova do prompt…

Colocando somente “cmd /c teste.bat”, ele parece que abre, mas não recebe as instruções do arquivo… sei lá… Porém, com esse código (de um outro post meu, baseado no código de um outro colega) parece que forçamos o java a interpretar o arquivo bat… testem ai:

import java.io.*;  

public class Teste {  
  
    public static void main(String[] args) throws IOException {  
        Process proc = Runtime.getRuntime().exec("cmd /c teste.bat");    
        InputStream in = proc.getInputStream();  
  
        byte buffer[] = new byte[1024];  
  
        while(in.read(buffer) >= 0) {  
            String buff = new String(buffer);
  
	    System.out.println(buff);
  
            buffer = new byte[1024]; 
        }  
  
        in.close();  
    }  
}

Veja meu bat:

@echo off
echo Testando...
notepad

Desta forma, ele vai abrir o arquivo bat, vai dar output daquele echo ali, e vai abrir o notepad. Beleza! Agora, o engraçado é que, quando retiramos todo o bloco While, substituindo por um in.read() ele continua funcionando em parte… ele só não dá o “echo Testando…”, mas chega a abrir o notepad =P

Acho esse comportamento meio estranho, rs… Se alguém tiver uma explicação certa do porquê disso, por favor…! =)

Valeu

A

Jexploitech, eu testei exatamente aquele código, e ele me abriu o bloco de notas, mas nao mostrou a janela do cmd.

O que acontece ai?

Jexploitech

Boa Madrugada Pessoal \o/!!! Como vão???

ArrancaToco, obrigado pela dica, mas realmente ele não funciona, tinha lido algo sobre diferenças de execuções em relação aos sistemas operacionais, isso influi mesmo?
pq eu só utilizo Win XP (e OpenSources tb)…mas o código não funcionou…

Jah o codigo do nosso amigo haroflow funcinou perfeitamente O.o"…o Bloco de Notas abriu normalmente, mas ñ abriu nenhuma outra janela do DOS…soh a que eu estou usando para compilar e executar…

haroflow, obrigado funcionou perfeitamente, mas o código eh mto grande assim mesmo para apenas abrir o bloco de notas???

pq como o código do ArrancaToco funcinou tb, será que existe uma relação de sistemas operacionais???

por mais que o seu esteja funcionando (haroflow), o do ArrancaToco eh mais compacto e objetivo neh…mas vou estudar profundamente as duas maneiras!!!

Muito Obrigado a todos vcs… \o/!!!

Feliz Ano Novo para todos e suas familias…

Abraços!

H

Opa…

Pois é… não sei qual a lógica disso… Fiz mais uns testes aqui, e a forma mais compacta que achei pra “fazer rodar” foi essa:

Process proc = Runtime.getRuntime().exec("cmd /c start teste.bat");

Note que tem um “start” ali… desse jeito funciona, mas ele vai abrir uma tela do prompt para aquele bat… Então não sei se serviria para você… Terias que colocar um “exit” no fim do bat, para ele sumir depois =P

Tirando o start, ele não faz nada… Não dá o echo, e não abre o notepad…

Outra forma mais simples de fazer:

Process proc = Runtime.getRuntime().exec("cmd /c teste.bat"); // Retirando o start daqui, para não abrir outra janela
InputStream in = proc.getInputStream();

in.read();
in.close();

Com esse código a mais (tem que ter o in.read()), ele não dá o echo, mas executa o notepad… rs

Ai aquele outro código enorme lá que você testou, dá o echo e executa o notepad… Vai saber… =/

Acho que a forma mais simples e funcional (que eu achei) seria essa segunda que te passei, com o in.read() meio que forçando o java à executar os comandos do bat… Mas você perderia o echo, e teriamos que testar com outros comandos, para ver se funcionam né… (o notepad abre =P)

flw

– EDIT –

Ok, estou maluco agora… =P

Com a seguinte linha no java

Process proc = Runtime.getRuntime().exec("teste.bat");

E com o bat:

notepad.exe

Não funciona… ok, agora com o bat assim:

@echo off
notepad.exe

Funciona! Ele abre o bloco de notas! o.O Agora tente colocar um echo:

@echo off
echo Teste
notepad.exe

e para de funcionar novamente! Nem echo, nem notepad.

:lol:

vlw

Criado 27 de dezembro de 2011
Ultima resposta 31 de dez. de 2011
Respostas 10
Participantes 5