wrappers de tipos discutidas no inicio deste capitulo.Regras de EscopoQuando uma variavel e referenciada no interior de um metodo, Java procura primeiro uma declaracao em um bloco mais externo. Se nao encontra enhuma declaracao, Java percorreos blocos alinhados, ate alcancar a definicao do metodo. Se a variavel se encontrar em qualquer lugar no interior de um metodo, ela tem prioridade sobre uma variavel de instancia ou de classe com nome semelhante. Por isso, encontramos frequentemente codigos como este:public RegistroSimples(Stringnome, String email) {this.nome = nome;this.email = email;}A palavra this e usada nesse caso para diferenciar a variavel de instancia da variavel local.Tratamento de ExcecoesUm grande desafio atualmente em programacao e saber como lidar com erros durante a execucao de maneira eficiente. Tradicionalmente, os programadores gerenciam os problemas pela passagem de codigos de sucesso ou falha em instrucoes return. Entao, as instrucoes de chamada verificamo codigo de retorno em uma instrucao if ... else. Se a funcao e bem-sucedida, e chamada uma sequencia de acoes: caso contrario, e executada outra serie de funcoes.Existem alguns problemas nesse tipo de abordagem. O excesso de instrucoes if ... else resulta em um aumento consideravel do tamanho do codigo. Alem disso, essa solucao nao implementa uma forte verificacao de erros.Java possui um consideravel esquema de verificacao de erros. Muitos deles sao interceptados pelo proprio compilador, ao inves de serem detectados somente na execucao. Porem, se alguma falha "passar" pelo compilador, o exame em uma pilha (veremos mais tarde que a virtual machine de Javae toda baseada na pilha) ira facilitar a busca do problema.Os tratadores de excecao e as classes de excecoesAs excecoes podem ser de diferentes tipos ou, mais especificamente, de classes distintas. Por exemplo, NumberFormatException se refere a uma classe especifica. Quando uma excecao e gerada, o sistema runtime do Java procura um tratador apropriado para interceptar a falha. O fato de um tratador ser ou nao apropriado para uma determinada excecao esta relacionado com a classeda excecao.Vejamos um exemplo: a classe ArithmeticException representa erros causados por operacoes aritmeticas invalidas (geralmente uma divisao por zero). Os objetos da classe ArrayIndexOutOfBoundsException sao emitidos quando e acessado um indice de array invalido.A classe Exception eutilizada para representar a classe geral de excecoes; na verdade, as outras classes de excecoes que foram discutidas sao subclasses de Exception. Vejamos como essas excecoes sao usadas:try {int x = Integer.parse(s);int y = Integer.parse(s2);int index = Integer.parseInt(s3);int a[] = new Int[5];a[index] = x/y;System.out.println("Tudo esta funcionando");}catch (ArithmeticException e) {System.out.println("Excecao aritmetica");}catch (ArrayIndexOutOfBoundsException e) {System.out.println("Excecao de indice de array fora doslimites");}catch (NumberFormatException e) {System.out.println("Impossivel converter String em numero");}catch (Eception e) {System.out.println("Excecao generica");}A primeira parte do codigo utiliza tres Strings de entrada e tenta converte-los em inteiros; se a conversao falha, e emitido um objeto NumberFormatException. No entanto, a terceira clausula catch ira interceptar o objeto emitido. Se a clausla nao existisse, a ultima clausula catch iria detectar o problema, porque NumberFormatException e uma subclasse de Exception.Depois que os Strinfs sao convertidos em numeros, o programa tenta dividir os numeros. Se houver uma tentativa de divisao por zero, e emitido um objeto ArithmeticException. O objeto e entao