2014-02-04 4 views
0

Проблема: Напишите программу, которая читает список действительных чисел. По завершении программы он должен распечатывать только уникальные номера. То есть, только цифры, которые появляются один раз в списке. Если есть более чем 50 уникальных номеров в списке, то вы должны напечатать только первые 50.Java: Локальная переменная, возможно, не была инициализирована?

import java.util.*; 
import java.io.*; 
import java.util.Arrays; 


public class Hmwk { 

    public static void main(String[] args) throws FileNotFoundException { 
     Scanner input=new Scanner (new File ("input.txt")); 
     int n = 0; 
     final int MAX_SIZE = 50; 
     double[] numbersArray; 
     while (input.hasNextDouble() && n<MAX_SIZE){ 
      double in = input.nextDouble(); 
      if (inList(in,numbersArray)) 
       numbersArray[n]=in; 
       n++; 

     } 
     printReport(numbersArray); 
    } 


    public static boolean inList(double number, double[] list){ 
     for (double i : list) { 
      if (i == number){ 
       return false; 
      } 
      else 
       return true; 
     } 
    } 

    public static void printReport(double[] list) { 
     System.out.printf("The unique numbers were", Arrays.toString(list)); 
    } 

} 

Я получаю сообщение об ошибке, говоря, что numbersArray не может быть инициализирован. Я также получаю сообщение о том, что мой логический метод inList должен возвращать логический тип, который меня смущает, потому что у меня есть два варианта возврата true или false. Буду признателен за любую оказанную помощь.

ответ

6

В самом деле, переменная

double[] numbersArray; 

не инициализирована, только что объявили. Вы не можете инициализировать его как:

double[] numbersArray = new double[MAX_SIZE]; 

После Вашего комментария:

Он печатает "уникальные номера были", но вот это, не уникальные номера

You» с использованием

System.out.printf("The unique numbers were",Arrays.toString(list)); 

Два варианта:

  1. Отправить параметр String используя %s где вы хотите/должны напечатать массив в виде строки:

    System.out.printf("The unique numbers were %s.",Arrays.toString(list)); 
    
  2. Использование System.out.println

    System.out.println("The unique numbers were " + Arrays.toString(list)); 
    
+0

Ого .. новобранец ошибку. Я ценю это! – user102817

+0

@ пользователь102817 приветствуется. Пожалуйста, не забудьте отметить сообщение, которое помогло вам больше всего в качестве ответа. –

+0

По какой-то причине он ничего не распечатывает? Не могли бы вы помочь? Он печатает «уникальные номера», но это не уникальные номера? Не уверен, где его беспорядок – user102817

0
public static void main(String[] args) throws FileNotFoundException { 
     Scanner input=new Scanner (new File ("input.txt")); 
     int n = 0; 
     final int MAX_SIZE = 50; 
     double[] numbersArray; // local variable are initialized at time of declaration 
     while (input.hasNextDouble() && n<MAX_SIZE){ 
      double in = input.nextDouble(); 
      if (inList(in,numbersArray)) 
       numbersArray[n]=in; 
       n++; 

     } 
     printReport(numbersArray); 
    } 

вы должны инициализировать его как

double[] numbersArray = new double[SIZE]; 
+0

* локальная переменная инициализируется во время объявления * это неверно. Поля класса инициализируются при создании нового экземпляра класса с его значением по умолчанию, например. 'class Foo {double [] numbersArray; } ', и значение по умолчанию для поля' numbersArray' будет 'null'. –

+0

переменные экземпляра @Luiggi Mendoza в классе назначаются значением по умолчанию, когда объект создан не локальными переменными – Tenacious

+0

Я просто комментирую комментарий рядом с 'double [] numbersArray;', что вводит в заблуждение. –

0

В обоих случаях не учитывают тот факт, что вы не могли бы в конечном итоге внутри цикла (ов).

в своем 1-ом случае:

double[] numbersArray; 
while (input.hasNextDouble() && n<MAX_SIZE){ 
    double in = input.nextDouble(); 
    if (inList(in,numbersArray)) 
     numbersArray[n]=in; 
     n++; 

} 

что, если вход не имеет двойной с самого начала идти? если это так, ваш numbersArray никогда не инициализировался. Хотя в более общих терминах, даже если есть двойной, не инициализирующийся, ваш numbersArray вызовет исключение.

в вашем втором случае:

for (double i : list) 
    { 
     if (i == number){ 
      return false; 
    } 
     else 
      return true; 
} 

если список пуст, то нет никакого возвращения заявления вернуться из.

Надежда, что помогает

0

Как уже говорилось выше, вы должны инициализировать numbersArray, как показано ниже:

двойной [] numbersArray = новый двойной [100]; // 100 может быть заменен любым целым числом, например, 50, 67, 62152 и т.д.

Попробуйте переписывания inList как это:

public static boolean inList(double number, double[] list){ 
    for (double i : list) 
     { 
      if (i == number){ 
       return false; 
      } 
    } 
    return true; 
} 
Смежные вопросы