Obviamente, é muito bom usar uma estrutura de log para mensagens de erro ou avisos. Mas às vezes eu uso System.out.println () se quiser tentar algo novo em pouco tempo.
É realmente tão ruim usar System.out.println () para algum teste rápido?
Obviamente, é muito bom usar uma estrutura de log para mensagens de erro ou avisos. Mas às vezes eu uso System.out.println () se quiser tentar algo novo em pouco tempo.
É realmente tão ruim usar System.out.println () para algum teste rápido?
System.err.println()
e veja o que acontece. Suponho que a ferramenta pense que você está usandoSystem.out
com o objetivo errado.Respostas:
Conforme revelado nos comentários, a verdadeira pergunta é: Por que as ferramentas de análise de código estático sinalizam os usos do System.out.println?
O motivo é que o envio de mensagens para o stdout geralmente é inadequado em um ambiente de produção. Se você estiver codificando uma biblioteca, a biblioteca deve retornar informações ao chamador, não imprimir em stdout. Se você estiver codificando um aplicativo GUI, as informações devem ser apresentadas ao usuário, e não para onde o stdout está apontando (o que pode não estar em lugar nenhum). Se você estiver codificando um servidor (ou algo que é executado em um contêiner do lado do servidor), você deve usar qualquer recurso de registro fornecido pela estrutura. E assim por diante.
Mas se você estiver usando println para depuração ou desenvolvimento, ou estiver escrevendo um programa e ler stdin e gravar em stdout, println estará perfeitamente bem. Não há nada de errado com esse tipo de casos.
fonte
Tudo
stdout
é armazenado em buffer e, portanto, é possível que seu programa falhe depois que você ligouprintln()
, mas antes que chegue à tela.Com isso dito, esse cenário é realmente improvável. Vá em frente e use-o, mas mantenha essa pequena limitação no fundo da sua mente.
fonte
System.out
é apenas um embrulhoBufferedOutputStream
. Provavelmente, isso é semelhante a qualquer estrutura de log que você usará; as estruturas apenas fornecem mais funcionalidade na forma de configuração e destino da sua saída de logfonte
É ruim se você estiver trabalhando em um programa não trivial e você
fonte
Existem algumas advertências sobre o uso
System.out
, mesmo em código descartável.Um grande problema é que geralmente é lento . Por exemplo, se você está tentando ter uma idéia aproximada da velocidade de algum código (observe que as marcas de microbench são difíceis ), adicionar um único em
System.out.println()
qualquer lugar pode realmente atrapalhar o seu tempo (porque está sincronizando e geralmente aguarda a saída real) fique visível para o usuário antes de retornar).Fora isso, eu não me preocuparia muito com isso no código descartável. Se você pretende confirmá-lo (seja como código de produção ou como código de teste), você deve se livrar dele e substituí-lo por uma chamada de registro apropriado (sim, mesmo no código de teste).
fonte
Como é frequentemente o caso, a resposta é "depende". Se o seu aplicativo já tiver uma estrutura de log em vigor, você poderá usá-lo. Ele não pode ser menos capaz do que
println()
, e você pode se beneficiar de outros recursos que ele fornece - rastreios de pilha, contexto extra, melhor formatação e assim por diante. Há também a possibilidade distinta de que as estruturas de log oferecem melhor recuperação de erros, garantindo que seus logs sejam gravados com sucesso, mesmo no caso de uma falha catastrófica.Portanto, a questão é quando adicionar um sistema de registro em primeiro lugar. Esta é uma decisão: você não deseja adicioná-lo muito cedo, apenas para descobrir que realmente não precisa dele. Você também não deseja adicioná-lo tarde demais e fazer um trabalho excessivo na conversão da sua solução ad-hoc.
Se você descobrir que está fazendo muito log
println()
, sua base de código está tentando dizer que está sofrendo dores de crescimento. Nesse ponto, vale a pena investir no registro adequado.fonte
Costumo ter o problema de o System.out.print usar a página de código "padrão do sistema", que geralmente é UTF-8 no Linux, mas algumas coisas ruins da Microsoft no Windows.
Isso pode levar a caracteres unicode que são ou não são impressos corretamente na tela, dependendo de onde o programa é executado.
Portanto, prefiro um PrintWriter personalizado sobre System.out
fonte
Não é nada mau. A noção pode resultar do fato de ser muito simples e não tão sofisticado quanto o uso de uma estrutura de log dedicada em seu aplicativo.
No entanto, isso não quer dizer que seja uma abordagem inválida. Eu o usei várias vezes para verificar o fluxo de aplicativos após alguns hijinks de programação de magia negra de vodu .
fonte
Não há nada errado em usá-lo, ele ajuda a descobrir 'o que diabos está acontecendo'.
Mas se seus colegas / outros desenvolvedores / ferramentas estão ridicularizando você, você sempre pode usar o Logger ou iniciar o teste do Junit !
fonte
O maior problema com o System.out.println local, a meu ver, é que é um "mau hábito (tm)". Se você estiver fazendo isso, provavelmente poderá melhorar sua efetividade ficando mais confortável usando seu depurador favorito.
Também com um depurador, você tem certeza de que um ponto de interrupção não entra no seu código de produção, enquanto um System.out.println pode.
Em uma nota lateral, se você está apenas fazendo um teste rápido e persiste em não usar um depurador, acho que o System.out.println é melhor do que usar uma estrutura de log, pois se você deixar acidentalmente uma instrução log.debug quando você pronto, é mais difícil erradicar.
fonte
Construir uma estratégia de teste inteira para ecoar o conteúdo do estado interno não é a jogada mais inteligente, mas para testes rápidos e sujos de código em desenvolvimento, a impressão estranha aqui e ali não será prejudicial enquanto você se lembrar de removê-los!
O perigo de esquecer de removê-los é provavelmente o motivo pelo qual é desaconselhado.
fonte