2013-07-30 3 views
0

Я получаю сообщение о том, что локальная переменная, возможно, не была инициализирована или не может быть разрешена переменной, в которой находится catch. Как это исправить? В принципе, я хочу, чтобы моя программа приняла несколько цифр, а затем остановилась и отобразила некоторые ответы.Локальная переменная, не инициализированная в функции catch

import java.util.Scanner; 

public class math2{ 
public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    System.out.print("Enter Integer Values\nEnter a Non-Integer When Finished\n"); 

     int x = input.nextInt(); 
     int max = x; 
     int min = x; 
     int sum = x; 
     double average = 0; 

    try 
    { 
    int amount = 1; 
    while(true) 
    { 
     x = Integer.parseInt(input.next()); 
     sum = sum + x; 
     amount++; 
     average = (double)sum/amount; 

      if (x > max) { 
       max = x; 
      } else if (x < min) { 
       min = x; 
      } 
    } 
    }catch(NumberFormatException e){ 
    System.out.println("The Maximum Value is " + max); 
    System.out.println("The Minimum Value Is " + min); 
    System.out.println("The Sum Is " + sum); 
    System.out.println("The Average Is " + average);} 
    } 

}

+0

Теперь все остальное работает, за исключением случаев, когда пользователь вводит не целое число в качестве своего первого числа. –

+0

Я обновил свое решение, чтобы решить проблему, пожалуйста, просмотрите – Prabhaker

ответ

2

Во-первых, определить переменные из стороны в try блок. Если вы определяете его в пределах try{}, он будет находиться внутри try{...} и невидим для блока catch(){}.

Во-вторых, вам необходимо указать начальное значение average. Локальные переменные никогда не инициализируются значениями по умолчанию.

double average = Double.NaN; 

Что делать, если переменная не была инициализирована внутри цикла while() из-за исключения?

+0

Быстрый ответ +1. Я бы предпочел NaN для случаев, когда значение действительно не определено. – kiheru

+0

Ну, он должен это сделать, но это не проблема ... Проблема в том, что он должен объявить переменные перед попыткой – Loki

6

объявите ниже переменной перед блоком try, чтобы они были доступны в блоке катафа.
, а также инициализировать double average для некоторого значения по умолчанию.

String x = input.next(); 
    int y = Integer.parseInt(x);*emphasized text* 
    int max = y; 
    int min = y; 
    int sum = 0; 
    double average = 0; 

Update

После правки в вопрос, который я заметил, что вы получаете InputMismatchException,
если вы даете Нецелочисленные как первый вход.
Для этого вы можете поймать, что Exception выйдет нормально из программы.
Замените этот код вместо int x = input.nextInt(); с информацией о коде.

int x = 0; 
    try{ 
     x = input.nextInt(); 
    }catch(InputMismatchException ime){ 
     //you cam use either of one statemnet.I used return statement 
     return ; 
     //System.exit(0); 
    }  
1

Потому что вы не инициализировали переменную «средний». Кроме того, я предлагаю вам объявить переменные за пределами блока catch try.

0

Объявите переменные max, min, average, sum перед блоком try. Эти переменные локальны для блока try. Если вы хотите использовать в catch catch, сделайте эти переменные как члены класса.

0
import java.util.Scanner; 

public class math2{ 
static double average; 
public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    System.out.print("Enter Integer Values\nEnter a Non-Integer When Finished\n"); 

    try 
    { 

    String x = input.next(); 
    int y = Integer.parseInt(x); 
    int max = y; 
    int min = y; 
    int sum = 0; 
    int amount = 0; 


    while(true) 
    { 
     sum = sum + y; 
     y = Integer.parseInt(input.next()); 

     amount++; 
     average = (double)sum/amount; 

      if (y > max) { 
       max = y; 
      } else if (y < min) { 
       min = y; 
      } 
    } 
    }catch(NumberFormatException e){ 
    System.out.println("The Maximum Value is " + max); 
    System.out.println("The Minimum Value Is " + min); 
    System.out.println("The Sum Is " + sum); 
    System.out.println("The Average Is " + average);} 
    } 

}

см вы объявляете переменную на уровне класса и компилятор присвоит это значение по умолчанию для вас ... но для локальных переменных, которые необходимо назначить его, как и упоминания в других постах

Смежные вопросы