Na descrição do método next() da classe Scanner, está o seguinte trecho:
No entanto, este método não serve para strings com mais de uma palavra (contendo espaços em branco). Tentei utilizar o método nextLine(), mas esse não está bloqueando a execução do aplicativo para que o usuário possa digitar os dados. O que pode ser feito para remediar este problema?
o nextLine ler toda a linha…
msm vc tendo espaços em branco entre palavras…
como vc esta fazeno?/
vlw
rafael.espiritosanto
Foi mal se ficou confuso
Segue parte do código
publicclassGeraArquivoConfiguracaoJabRef{finalstaticStringTABNAME="customTabName_";finalstaticStringTABFIELD="customTabFields_3";staticintvalor=3;publicstaticvoidmain(String[]args){intopcao=0;Scannerscan=newScanner(System.in);Vector<String>perguntas=newVector<String>();Vector<String>criteriosInclusaoExclusao=newVector<String>();Vector<String>criteriosAvaliacaoQualidade=newVector<String>();Vector<String>criteriosHierarquizacao=newVector<String>();do{System.out.println("Selecione a opção");System.out.println("1 - Adicionar Critério de Inclusão/Exclusão");System.out.println("2 - Adicionar Critério de Avaliação de Qualiadde");System.out.println("3 - Adicionar Critério de Hierarquização");System.out.println("4 - Adicionar Campo de Dados a Ser Extraído de Estudos Primários");System.out.println("5 - Gerar Arquivo de Preferências do JabRef");System.out.println("6 - Sair");try{opcao=scan.nextInt();}catch(InputMismatchExceptione){System.out.println("opção inválida!");break;}switch(opcao){case1:adicionaCriterioInclusaoExclusao(scan,criteriosInclusaoExclusao);break;case2:adicionaCriterioAvaliacaoQualidade(scan,criteriosAvaliacaoQualidade);break;case3:adicionaCriterioHierarquizacao(scan,criteriosHierarquizacao);break;case4:adicionaPergunta(scan,perguntas);break;case5:try{geraArquivoPreferencia(perguntas,criteriosInclusaoExclusao,criteriosAvaliacaoQualidade,criteriosHierarquizacao);}catch(JDOMExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}break;case6:System.out.println("Aplicativo Finalizado");break;default:System.out.println("Opção inválida");break;}}while(opcao!=6);}privatestaticvoidadicionaCriterioHierarquizacao(Scannerscan,Vector<String>criteriosHierarquizacao){System.out.println("Informe o critério");Stringpergunta=scan.nextLine();criteriosHierarquizacao.add(pergunta);}
D
Damiao_Cunha
especifique auql é o problema…
vlw
D
Damiao_Cunha
ahh sim…entendi o q vc quis dizer…
cria uma nova Scanner dentro do metodo…
assim…
publicclassGeraArquivoConfiguracaoJabRef{finalstaticStringTABNAME="customTabName_";finalstaticStringTABFIELD="customTabFields_3";staticintvalor=3;publicstaticvoidmain(String[]args){intopcao=0;Scannerscan=newScanner(System.in);Vector<String>perguntas=newVector<String>();Vector<String>criteriosInclusaoExclusao=newVector<String>();Vector<String>criteriosAvaliacaoQualidade=newVector<String>();Vector<String>criteriosHierarquizacao=newVector<String>();do{System.out.println("Selecione a opção");System.out.println("1 - Adicionar Critério de Inclusão/Exclusão");System.out.println("2 - Adicionar Critério de Avaliação de Qualiadde");System.out.println("3 - Adicionar Critério de Hierarquização");System.out.println("4 - Adicionar Campo de Dados a Ser Extraído de Estudos Primários");System.out.println("5 - Gerar Arquivo de Preferências do JabRef");System.out.println("6 - Sair");try{opcao=scan.nextInt();}catch(InputMismatchExceptione){System.out.println("opção inválida!");break;}switch(opcao){case1:adicionaCriterioInclusaoExclusao(scan,criteriosInclusaoExclusao);break;case2:adicionaCriterioAvaliacaoQualidade(scan,criteriosAvaliacaoQualidade);break;case3:adicionaCriterioHierarquizacao(scan,criteriosHierarquizacao);break;case4:adicionaPergunta(scan,perguntas);break;case5:try{geraArquivoPreferencia(perguntas,criteriosInclusaoExclusao,criteriosAvaliacaoQualidade,criteriosHierarquizacao);}catch(JDOMExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}break;case6:System.out.println("Aplicativo Finalizado");break;default:System.out.println("Opção inválida");break;}}while(opcao!=6);}privatestaticvoidadicionaCriterioHierarquizacao(Scannerscan,Vector<String>criteriosHierarquizacao){ScannernovaScan=newScanner(System.in);System.out.println("Informe o critério");Stringpergunta=novaScan.nextLine();criteriosHierarquizacao.add(pergunta);}
testa essa ai…vlw
rafael.espiritosanto
O problema é que ao executar o código
opcao=scan.nextInt()
o aplicativo bloqueia o fluxo de execução até que eu forneça a opção. No entanto, o mesmo não acontece quando é executado o trecho
String pergunta = scan.nextLine(); Com isso o aplicativo segue no loop e as opções de escolha são novamente exibidas, sem que eu tenha a possibilidade de digitar o critério desejado (um exemplo de critério seria: O artigo está em inglês).
Se eu uso scan.next() ao invés de scan.nextLine(), o problema acima não ocorre. No entanto, o valor da variável pergunta vai ser somente a primeira palavra (no exemplo corresponderia a “O”), ou seja, o restante da linha vai ser descartado.
vlw
tnaires
Estranho… Fiz o mesmo teste aqui na minha máquina e o nextLine() ficou esperando minha entrada.
O que o método delimiter() da classe Scanner tá retornando?
rafael.espiritosanto
Estranho… a solução de criar um novo Scanner dentro do método funcionou, mas não sei dizer o por quê…
Eu usei o código System.out.println(scan.delimiter().pattern()); e o conteúdo retornado foi \p{javaWhitespace}+
Tentei “setar” o delimiter com o valor “\r” mas o aplicativo continuou em loop. Se usar “\n\r” o aplicativo fica travado eternamente e se uso apenas “\n” o aplicativo cai na exceção InputMismatchException por causa do método scan.nextInt()
vlw
FacaNaCaveira
Fala ai rafael.espiritosanto, nao sei se compreendi direito o seu problema, mas pelo o que percebi nao seria melhor criar um metodo so para fazer a leitura do parametro scan e outro metodo para o criteriosHierarquizacao?
Mas eu já não estou fazendo isto? Vê lá no código. Um amigo descobriu o problema. O erro estava no trecho
opcao=scan.nextInt();
O \n da linha do int que tava sendo pego como lixo!
Mudei para
opcao=Integer.parseInt(scan.nextLine());
e funcionou!
Valeu pela ajuda pessoal!
ViniGodoy
Ao ler do console, use somente o método nextLine().
Alguns professores tem ensinado o nextInt() e outros métodos similares, mas isso está errado.
Lembre-se a única terminação válida num terminal é o \n (ou \r\n, no caso do Windows), que o nextInt() não foi feito para capturar. Se você usar o nextInt() ele captura o inteiro e mantém o \n no buffer, que será lido no próximo nextLine(), o que gera depois os problemas que você vivenciou.
tnaires
ViniGodoy:
Ao ler do console, use somente o método nextLine().
Alguns professores tem ensinado o nextInt() e outros métodos similares, mas isso está errado.
Lembre-se a única terminação válida num terminal é o \n (ou \r\n no caso do Windows), que o nextInt() não foi feito para capturar. Se você usar o nextInt() ele captura o inteiro e mantém o \n no buffer, que será lido no próximo nextLine(), o que gera depois os problemas que você vivenciou.
Nossa Vini, matou a pau nessa explicação… Não sabia dessa particularidade!
ViniGodoy
rafael.espiritosanto:
Foi mal se ficou confuso
Segue parte do código
Agora que voltei nesse código depois de uns dias que vi. Você está usando Vector.
Recomendo fortemente que você troque pela classe ArrayList, que é o substituto do Vector. A Sun desaconselha o uso do Vector desde o Java 1.2, onde foi introduzida a Collections Framework.