Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro na hora de receber a variável do catch

Estou realizando uns exercícios para treinar Exceções, a questão é a seguinte:

Nesta questão você deve identificar as partes problemáticas do código e reescrevê-lo utilizando tratamento de exceções. Ou seja, devem ser identificadas todas as exceções que podem ser levantadas e, para cada uma, deve ser dado o tratamento adequado que, nesse exercício, significa alertar o usuário quanto ao problema. Entretanto, nesse programa a leitura dos valores deve ser feita, mesmo que para isso o usuário tenha que tentar informar várias vezes os valores na mesma execução do programa.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Então fiz o seguinte código :

import java.util.Scanner;
class Main {  

  public static void main(String args[]) { 

    System.out.println("Eu sei dividir!");
    numero1();
    numero2();
    double r = (x / y);
    System.out.println("O resultado da soma é: "+r);

  }

  static void numero1(){
  Scanner teclado =  new Scanner(System.in); 
    try {
      System.out.println("Informe o primeiro valor: ");
      int x = teclado.nextInt();
    } catch (Exception ex){
      String msg = ex.getMessage();
      System.out.println("Exception: "+msg);
      numero1();
    }
  }
  static void numero2(){
  Scanner teclado =  new Scanner(System.in); 
    try {
      System.out.println("Informe o segundo valor: ");
      int y = teclado.nextInt();
    }catch (Exception ex){
      String msg = ex.getMessage();
      System.out.println("Exception: "+msg);
      numero2();
    }   

  }
}

Mas está dando este erro:

 javac -classpath .:/run_dir/junit-4.12.jar:target/dependency/* -d . Main.java
Main.java:9: error: cannot find symbol
    double r = (x / y);
                ^
  symbol:   variable x
  location: class Main
Main.java:9: error: cannot find symbol
    double r = (x / y);
                    ^
  symbol:   variable y
  location: class Main
2 errors
exit status 1
 

Não sei como resolver

1 resposta
solução!

Olá, Jamili!

O que acontece é que você não declarou as variáveis x e y na função main(), mas tenta usá-las mesmo assim. Em Java, as variáveis declaradas fora de classes têm escopo de bloco, ou seja, quando você declara uma variável dentro de chaves {}, ela só é conhecida dentro do trecho de código contido nessas mesmas chaves.

Você pode ver mais detalhes sobre esse assunto em: http://mateusduraes.github.io/escopo-de-variaveis-em-java/

O correto a se fazer nesse caso é retornar as variáveis lidas dentro das suas funções de leitura, e usar o valor delas para preencher variáveis declaradas na sua função main().

Ficaria assim:

import java.util.Scanner;
class Main {  

  public static void main(String args[]) { 

    System.out.println("Eu sei dividir!");
    int x = numero1();
    int y = numero2();
    double r = (double)x / y;
    System.out.println("O resultado da divisão é: "+r);

  }

  static int numero1(){
    int x = 0;
    Scanner teclado =  new Scanner(System.in); 
    try {
      System.out.println("Informe o primeiro valor: ");
      x = teclado.nextInt();
    } catch (Exception ex){
      String msg = ex.getMessage();
      System.out.println("Exception: "+msg);
      numero1();
    }
    return x;
  }

  static int numero2(){
    int y = 0;  
    Scanner teclado =  new Scanner(System.in); 
    try {
      System.out.println("Informe o segundo valor: ");
      y = teclado.nextInt();
    }catch (Exception ex){
      String msg = ex.getMessage();
      System.out.println("Exception: "+msg);
      numero2();
    }   
    return y;
  }

}

Observe que precisei alterar o tipo (fazer um casting) de um dos valores inteiros lidos, na hora de fazer a divisão, para que a parte decimal do valor obtido na divisão não fosse perdida. Isso acontece porquê quando você tenta fazer a divisão de dois números inteiros, mesmo que o resultado seja decimal, o compilador "joga fora" a parte decimal e só te entrega a parte inteira, pois entende que você queria a divisão inteira dos números.

Você pode ver melhor como isso funciona em: https://www.delftstack.com/pt/howto/java/integer-division-java/

Outra solução seria mudar o tipo de x e y para float.

Espero ter ajudado!

Boa sorte em seus estudos!