Exercicio do livro Use a Cabeça Java(Exceptions)

5 respostas
D
Esse é meu primeiro post em um forum. Como vocês podem perceber pela minha pergunta estou começando a aprender agora a linguagem Java, rsrs... Resolvi começar meus estudos com o livro Use a Cabeça Java e tem um código escrito nele que esta dando erro na hora da execução e eu não consegui resolver, alguém pode me ajudar por favor? O código está escrito igual no livro
import javax.sound.midi.*;

public class MiniMiniMusicApp {
	
	public static void main(String[] args){
	MiniMiniMusicApp mini = new MiniMiniMusicApp();
	mini.play();
	}
	
	public void play(){
		try{
			Sequencer player = MidiSystem.getSequencer();
			player.open();
			
			Sequence seq = new Sequence(Sequence.PPQ, 4);
			
			Track track = seq.createTrack();
			
			ShortMessage a = new ShortMessage();
			a.setMessage(114, 1, 44, 100);
			MidiEvent noteOn = new MidiEvent(a, 1);
			track.add(noteOn);
			
			ShortMessage b = new ShortMessage();
			b.setMessage(128, 1, 44, 100);
			MidiEvent noteOff = new MidiEvent(b, 16);
			track.add(noteOff);
			
			player.setSequence(seq);
			
			player.start();
			Thread.sleep(1000*2);
			player.close();
			System.exit(0);
		}catch (Exception ex){
			ex.printStackTrace();
		}
	}
}

O erro que ocorre é este :

javax.sound.midi.InvalidMidiDataException: command out of range: 0x72
	at javax.sound.midi.ShortMessage.setMessage(Unknown Source)
	at MiniMiniMusicApp.play(MiniMiniMusicApp.java:20)
	at MiniMiniMusicApp.main(MiniMiniMusicApp.java:7)

5 Respostas

lucas_guj

Na linha 20 do seu código altere o 44 para 20. Assim:

a.setMessage(114, 1, 20, 100);

Traduzindo o seu erro diz que você deu um dado inválido como argumento que está fora da taxa de dado válida.

D

Ainda não deu certo.
Deu o mesmo erro.

Essa questão de ler o erro eu realmente ainda não consegui entender direito,
essa saida de erro

javax.sound.midi.InvalidMidiDataException: command out of range: 0x72 at javax.sound.midi.ShortMessage.setMessage(Unknown Source) at MiniMiniMusicApp.play(MiniMiniMusicApp.java:20) at MiniMiniMusicApp.main(MiniMiniMusicApp.java:7)

Significa que o
metodo play() esperava 20 como retorno
e o metodo main() esperava 7 como retorno.

Ou nada haver, estou viajando?

wagnerfrancisco

Não Diego, 20 e 7 são o número das linhas. Quando uma exceção é lançada é impressa a stack trace, as linhas onde o programa executou ao lançar a exceção.

Nesse caso, ele passou no método main da classe MiniMiniMusicApp (linha 7), no método play (linha 20) e no método setMessage da classe ShortMessage (como vc não tem o código-fonte dela, não é possível especificar a linha). Depois vem a exceção especificamente.

E quando à exceção, eu desconheço esta api de manipulação midi, não posso lhe ajudar. :stuck_out_tongue:

lucas_guj

O wagnerfrancisco esclareceu o seu entendimento errado sobre o erro. E você não deve ter feito o que eu falei. Copie e cole o código:

import javax.sound.midi.*;  
      
    public class MiniMiniMusicApp {  
          
        public static void main(String[] args){  
        MiniMiniMusicApp mini = new MiniMiniMusicApp();  
        mini.play();  
        }  
          
        public void play(){  
            try{  
                Sequencer player = MidiSystem.getSequencer();  
                player.open();  
                  
                Sequence seq = new Sequence(Sequence.PPQ, 4);  
                  
                Track track = seq.createTrack();  
                  
                ShortMessage a = new ShortMessage();  
                a.setMessage(114, 1, 20, 100);  
                MidiEvent noteOn = new MidiEvent(a, 1);  
                track.add(noteOn);  
                  
                ShortMessage b = new ShortMessage();  
                b.setMessage(128, 1, 44, 100);  
                MidiEvent noteOff = new MidiEvent(b, 16);  
                track.add(noteOff);  
                  
                player.setSequence(seq);  
                  
                player.start();  
                Thread.sleep(1000*2);  
                player.close();  
                System.exit(0);  
            }catch (Exception ex){  
                ex.printStackTrace();  
            }  
        }  
    }
D

Entendi a questão da leitura da saída de erro, valeu pessoal.

Quanto ao codigo Lucas eu já tinha tentado o que vc me disse e não tinha dado certo.
Ai por desencargo de consciência copiei o seu codigo e colei e deu o mesmo erro.

Eu estava vendo no livro que este argumento que você está pedindo para alterar seria referente a nota chamada, seria esse o erro mesmo?

Criado 8 de agosto de 2012
Ultima resposta 10 de ago. de 2012
Respostas 5
Participantes 3