Pular para o conteúdo principal

BUG no JDK da SUN

Todos conhecem os métodos print e println da classe PrintStream, pois já devem ter utilizado as instruções System.out.print ou System.out.println para imprimir alguma mensagem no console. Pense rápido: O que acontece se passarmos um parâmetro nulo no método println?

System.out.println(null);

Ocorre um erro de compilação. Mas vamos mudar a pergunta. O que acontece se passarmos uma referência nula no parâmetro do método println?

String str = null;
System.out.println(str);

Compila e imprime a String "null", pois o método println chama o método print, que por sua vez valida se a referência é nula, e caso seja, inicializa o valor com o texto "null", veja abaixo a sequência dos métodos:

public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}

Mas o que acontece se passarmos qualquer outro objeto no parâmetro do método println?

Object obj = null;
System.out.println(obj);

Também compila, pois o método println sobrecarregado com o parâmetro do tipo Object, chama o método print sobrecarregado com o parâmetro do tipo Object:

public void println(Object x) {
synchronized (this) {
print(x);
newLine();
}
}

Mas por não ser uma String, antes de chamar o método write para imprimir a mensagem no console, é chamado o método valueOf da classe String, passando esse objeto como parâmetro para obter um texto:

public void print(Object obj) {
write(String.valueOf(obj));
}

E por segurança, para evitar um NullPointerException, é validada se a referência do parâmetro é nula, e caso não, então chama o método toString da classe Object, ou o método toString do próprio objeto, caso tenha sido sobrescrito.

public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}

E nesse caso como a referência é nula, retorna a String "null". Mas você deve estar pensando: Para que tudo isso? Nem estou estudando para certificação...Ou, o Eclipse e Netbeans verificam isso pra mim...Ou, o corinthians vai retomar a boa fase...Ou, etc... Fiz tudo isso para contar uma historinha e montar uma linha de raciocinio para ficar mais fácil de visualizar o erro que encontrei.

Sabemos que quando passamos um objeto como parâmetro no método println ou print, é chamado o método toString() da classe Object ou o da própria classe caso tenha sido sobrescrito.
Agora a última pergunta: o que acontece se sobrescrevermos o método toString retornando null e passarmos o objeto dessa nossa classe como parâmetro no método println?

public class Test {
public static void main(String[] args) {
Test t = new Test();
System.out.print(t);
}
public String toString() {
return null;
}
}

Compila, mas estoura um NullPointerExcpetion, pois como vimos anteriormente, o método println chama o método print sobrecarregado para o parâmetro do tipo Object, que chama o método valueOf da classe String:

public void print(Object obj) {
write(String.valueOf(obj));
}

E o método valueOf chama o toString do nosso objeto, que retornará um null:

public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}

Passando então uma referência nula para o método write, que por sua vez chama o método write da classe BufferedWriter que tenta chamar o método length da classe String e como o objeto é nulo...BUM, estoura um NullPointerException:

public void write(String str) throws IOException {
write(str, 0, str.length());
}

Nesse momento fiquei feliz, pois encontrei um bug na JVM da SUN e iria mandar imediatamente para eles e ficar famoso (brincadeira), até me lembrar que estava usando o Java 5. E quando fui testar com o Java 6, o problema já tinha sido resolvido. Mostrei o problema ao Kleber, instrutor da Globalcode, que lamentou junto comigo.

Mas eu não iria postar esse texto enorme caso não houvesse nenhum bug, certo? Talvez sim, mas nesse caso não. Na semana seguinte o Kleber comentou que no Java 6 o problema ainda persistia no método print, pois foi corrigido apenas o método println.

Já enviei o bug para a SUN, tenho certeza que não ficarei famoso por isso, mas ficaria feliz caso eles me enviassem um Voucher, rs...Eles ainda não publicaram no site, mas acho que em breve estará disponível no link: http://bugs.sun.com/bugdatabase/

E não precisam se assustar, pois não costumo sobrescrever o método toString retornando null, esse cenário ocorreu em um dos laboratórios com EJB3 do curso Academia Enterprise, e achei que fossem muitos outros problemas até encontrar a verdadeira causa, e depois que mostrei para os colegas da turma eles também não se conformaram, rs.

Aproveitem isso para apostar almoços com seus amigos javeiros, eu já ganhei dois (brincadeira denovo)...

Comentários

Unknown disse…
O método toString deve retornar uma representação String do Objeto. Se o objeto não é nulo, o toString deve retornar uma String não nula.
Não existe bug, é só saber o contrato do método.
É como dizer que HashMap e o HashSet contém bugs porque você não sabe implementar o equals e o hashCode.
Perenha disse…
Olá Diego,
Concordo com você sobre o método toString, mas o bug que comentei no post se encontra no método print da classe PrintStream.
Pois ele faz uma chamada ao método toString do objeto e em seguida chama o método length do objeto String retornado. E se houve algum erro na sobrescrita do método toString, retornando nulo, estoura um NullPointerException.
Eu ainda acho que é um bug, pois esse problema foi corrigido para o método println na versão 6. Mas eu mandei o problema para a SUN, eles demoram um pouco para responder, mas se eles disserem que não é um bug, eu prometo enviar para você.
Abraço.
Yara Senger disse…
Rodrigo, eu gostei muito do post, mas pela experiência em sala de aula do que pelo próprio bug.

Ao encontrar um erro em um programa, as vezes pensamos "Não é possível, eu estou fazendo tudo certo. Já conferi várias vezes, deve ser um bug".

Infelizmente, ou felizmente na maioria das vezes o erro é nosso... (risos).E comprovar que é um bug nem sempre é trivial.

Mas, se pensarmos bem, quando o erro é realmente um bug é muito pior, pois sendo um erro nosso corrigimos e pronto. Caso seja mesmo um bug E caso o software seja Open source, ainda assim não está totalmente no nosso controle corrigir o bug. Mas existem esperanças. (risos)

Por isto, acredito que neste caso, mais importante do que o próprio bug é a experiência vivenciada, uma das formas mais motivadoras de convencer as pessoas sobre a importância do Open Source, e muitas vezes capaz de transformar uma pessoa ou uma empresa de usuário de Open Source para colaborador, ou "commiter" de um projeto.

Você já testou no OpenJDK ?

PS: Talvez você já seja colaborador, manifestei minha opinião de forma geral.

[]s
Yara

Postagens mais visitadas deste blog

Você já pensou em ser palestrante em algum evento ?

Você já deve ter participado de algum evento e pensado como deve ser legal ser palestrante... E para falar a verdade, é muito bom mesmo. Eu adoro, o Vinicius adora e conheço muitas pessoas que curtem cada minuto da participação no evento como palestrante. Com certeza é uma responsabilidade a mais. Você sente medo, adrenalina, tem que se preparar. Literalmente coloca a cara a tapa para qualquer pessoa te avaliar em todos os sentidos. Qual o seu tom de voz?  Seus slides são legais? Você manja mesmo ?  Seu português está ok?  E as palavras em inglês ?  Teve algum deslize técnico? E MUITO mais.  Mas é claro que a exposição tem dois lados... e os resultados podem ser ótimos. Normalmente conhecemos mais pessoas como palestrantes e podem surgir boas oportunidades de negócio. É sempre positivo ter uma nova referência positiva quando as pessoas buscam nosso nome no Google, podemos fazer a diferença para quem está assistindo a palestra e muito mais.  No The Developer's

TDC ONLINE: SUA PLATAFORMA DE PALESTRAS GRAVADAS DO TDC DISPONÍVEL

Além do conteúdo ao vivo transmitido online nas edições do TDC, agora você pode ter acesso à centenas de palestras gravadas, através da nossa nova plataforma de vídeos - o TDC Online, que reúne todas as Trilhas premium, Stadium e Salas dos Patrocinadores das edições anteriores de 2022, TDC Innovation e TDC Connections.  Para acessar, basta clicar na edição em que você participou ( TDC Innovation ou TDC Connections ); Fazer o mesmo login (com e-mail e senha) cadastrados na hora de adquirir ou resgatar o seu ingresso no TDC; E clicar na Trilha de sua opção, e de acordo com a modalidade do seu ingresso. Logo em seguida, você será direcionado para a seguinte página com a lista de todas as palestras por Trilha: Pronto! Agora você tem acesso à centenas de palestras gravadas da sua área de interesse, para assistir como e quando quiser! Caso tenha esquecido a senha, clique na opção "Esqueci a senha" , insira o e-mail que você realizou para o cadastro no evento, e aparecerá a op

TDC INNOVATION lança University Pass

Modalidade de ingresso tem como objetivo ajudar na capacitação dos universitários Uma pesquisa realizada em 2020 pela Associação Brasileira das Empresas de Tecnologia da Informação e Comunicação (Brasscom) diz que até o ano de 2024 o Brasil precisará de cerca de 420 mil profissionais na área de Tecnologia da Informação. Porém, por ano, a mesma pesquisa diz que o país forma apenas 46 mil profissionais capacitados no nicho. Pensando nisso, para ajudar na formação e capacitação desses jovens profissionais, o TDC INNOVATION, segunda edição do ano do The Developer's Conference, lança o University Pass, modalidade de ingresso que possibilita aceso digital gratuito a todas as palestras do evento, ou com 50% de desconto para quem preferir ir pessoalmente. Com o tema central “Desafios para a criação do futuro Digital”, o TDC INNOVATION ocorrerá entre 1 e 3 de junho, de forma híbrida: presencialmente no Centro de Convenções CentroSul, em Florianópolis, e com transmissão simultaneamente pela

TDC Digital: o que você precisa saber para transformar sua carreira em 2022

O TDC Digital é o maior evento de TI do mercado e proporciona crescimento profissional a partir de palestras com especialistas e oportunidades de networking com o mundo todo, direto da sua casa. Através da escolha individual de cada participante é possível obter experiências imersivas e transformadoras conforme o tema-chave de cada trilha.  O evento também é o lugar ideal para ajudar no desenvolvimento de carreiras, permitindo que qualquer pessoa com vontade — e um tema interessante — seja palestrante e compartilhe suas experiências e conhecimentos. Para aqueles que querem  participar como ouvinte a plataforma do TDC favorece conferências dinâmicas, e o encontro de diversas comunidades e ecossistemas de TI. E, após a escolha de uma trilha, fica mais fácil acompanhar especialistas para aprender e se inspirar. Em 2021, o The Developer’s Conference (TDC) foi 100% digital e, em três dias de evento, contou com mais de 300 horas de conteúdos , incluindo: Agile; Testes; Design; Web e Mobile;

Segurança da informação no alvo: o que esperar do futuro?

A segurança da informação não se trata apenas de proteger os dados contra acesso não autorizado. Na prática, refere-se aos recursos que impedem: uso; registro; inspeção; divulgação; interrupção; modificação; destruição de dados. O uso de dados pode abranger desde um perfil nas redes sociais a detalhes financeiros, biometrias ou novos projetos. Por isso, a preocupação com a proteção dos dados é crescente, tanto para empresas quanto clientes. Para muitas pessoas, a coleta de dados é considerada invasão de privacidade, criando desconfiança do titular dos dados, pois o uso dos dados pode ser facilmente corrompido, utilizado para fins não declarados. Apesar de o uso dos dados terem impulsionado os avanços tecnológicos na última década, as organizações lidam com o desafio de distinguir dados de informações pessoais de modo a proteger a privacidade e as preferências dos clientes. Neste artigo, abordaremos o impacto da segurança da informação e o que esperar do futuro. Confira casos conhecido

Inspire a mudança com a liderança ágil

A liderança ágil é essencial para que uma organização realize mudanças de negócios significativas. Ser líder é uma tarefa desafiadora, especialmente em um cenário de constantes transformações, principalmente na forma de lidar com a relação empresa e pessoal. Pesquisas sobre liderança na era digital revelam que algumas soft skills têm sido substituídas por outras, o profundo conhecimento na área de negócio, ser referência nas tecnologias utilizadas, ter foco total no prazo e nas entregas e conhecer um arsenal de técnicas e ferramentas, têm dado espaço a habilidades, como: empatia; adaptabilidade; visão e propósito; engajamento constante; senso de equipe.   A colaboração entre pessoas de todos os níveis hierárquicos são vitais, afinal, as equipes estão trabalhando para o mesmo objetivo: o encantamento e atendimento das necessidades do cliente que proporcionarão um crescimento sustentável da organização. Com propósito claro, estratégia e prioridades definidas, os times desfrutam de uma