2013-12-01 5 views
0
private int getBirthdayYear(){ 
     Random r1 = new Random(); 
     int x = r1.nextInt(1000); 
     int year = 1000+ x; 
     return birthdayYear; 
     } 
      private String getBirthday(){ 
     int year = getBirthdayYear(); 
     Random r2 = new Random(); 
     int y = r2.nextInt(11); 
     String monthStr; 
     int month = 1 + y; 
      switch (month) { 
      case 1: monthStr = "January"; 
        break; 
      case 2: monthStr = "February"; 
        break; 
      case 3: monthStr = "March"; 
        break; 
      case 4: monthStr = "April"; 
        break; 
      case 5: monthStr = "May"; 
        break; 
      case 6: monthStr = "June"; 
        break; 
      case 7: monthStr = "July"; 
        break; 
      case 8: monthStr = "August"; 
        break; 
      case 9: monthStr = "September"; 
        break; 
      case 10: monthStr = "October"; 
        break; 
      case 11: monthStr = "November"; 
        break; 
      case 12: monthStr = "December"; 
        break; 
      default: monthStr = "Invalid"; 
        break; 
     } 


     Random r3 = new Random(); 
     **int day;// day variable declared as int** 
     if(month == 1||month == 3||month == 5||month == 7||month == 8||month == 10||month == 12){ 
     int z1 = r3.nextInt(30); 
     day = 1 + z1; 
     } 
     else if(month == 2||month == 4||month == 6||month == 9||month == 11){ 
      int z2 = r3.nextInt(29); 
     day = 1 + z2; 
     } 
     else if(month == 2 & year%4 ==0){ 
     int z3 = r3.nextInt(28); 
     day = 1 + z3; 
     } 
     else if(month == 2 & year%4 != 0){ 
     int z4 = r3.nextInt(27); 
     day = 1 + z4; 
     } 

     **birthday = monthStr + " " + day + "th " + year;// error here. day variable is not initialized 
     return birthday;** 
      } 

Это код для генерации случайной даты рождения, но я не уверен, если он работает. Я все еще работаю над этим. Прямо сейчас, когда я пытаюсь скомпилировать этот код, он говорит, что переменная дня еще не инициализирована. Тем не менее, я уже говорил в течение дня. Что мне делать, чтобы исправить эту проблему?int переменная не инициализирована

+0

-1 [Поиск сообщений об ошибках] (http://stackoverflow.com/search?q =% 5Bjava% 5D +% 22variable + may + not + have + был + инициализирован% 22) - он довольно распространен и происходит потому, что локальной переменной (которая не имеет значения по умолчанию) * должно быть присвоено значение * вдоль каждого возможного пути выполнения доводя до того, где он доступен. – user2864740

ответ

1

В Java вы не можете использовать переменную, которая может быть неинициализирована. «Uninitialized» означает, что переменная, возможно, не была настроена ни на что. Если компилятор не может доказать, что переменная всегда инициализирована, это приведет к ошибке.

int a; 

// a is uninitialized 

if(r.nextInt(10) < 2) 
    a = 5; 

// a has an 80% chance of still being uninitialized 

System.out.println(a); // error: a might not be initialized. 

В вашем случае:

int day; 
// day is uninitialized 
if(month == 1||month == 3||...){ 
    int z1 = r3.nextInt(30); 
    day = 1 + z1; 
} 
else if(month == 2||month == 4||month == 6||month == 9||month == 11){ 
    int z2 = r3.nextInt(29); 
    day = 1 + z2; 
} 
else if(month == 2 & year%4 ==0){ 
    int z3 = r3.nextInt(28); 
    day = 1 + z3; 
} 
else if(month == 2 & year%4 != 0){ 
    int z4 = r3.nextInt(27); 
    day = 1 + z4; 
} 
// if the month wasn't between 1 and 12, day is still uninitialized 

Компилятор не достаточно умны, чтобы обнаружить, что month всегда находится между 1 и 12. Исправление, чтобы убедиться, day всегда устанавливается на что-то, даже если month не находится в этом диапазоне.

Один из способов сделать это:

int day; 
// day is uninitialized 
if(month == 1||month == 3||...){ 
    int z1 = r3.nextInt(30); 
    day = 1 + z1; 
} 
else if(month == 2||month == 4||month == 6||month == 9||month == 11){ 
    int z2 = r3.nextInt(29); 
    day = 1 + z2; 
} 
else if(month == 2 & year%4 ==0){ 
    int z3 = r3.nextInt(28); 
    day = 1 + z3; 
} 
else if(month == 2 & year%4 != 0){ 
    int z4 = r3.nextInt(27); 
    day = 1 + z4; 
} 
// THIS PART IS NEW 
else 
    day = -1; // this line will never actually run 

Теперь компилятор может сказать, что, независимо от того, что происходит, day не всегда устанавливается на что-то после этого, если заканчивается заявление.

Отметьте, что day = -1; никогда не запускается. Только там компилятор может доказать, что day всегда имеет значение.

Другой способ исправить ошибку - изменить int day; на int day = -1; - по той же причине.

0

Вы заявили об этом, но вы не инициализировали int. Инициализация это будет выглядеть примерно так:

int day = 0; 
0

Вы, возможно, придется инициализировать день до только определив его, а именно:

int day = -1; 

Я думаю, что Java не знает, если вы инициализации переменной или если он просто лежит вокруг, без какого-либо значения, прежде чем добавлять его к другой переменной.

0

Локальная переменная (переменная в методе) не инициализирован по умолчанию, поэтому, набрав:

int day; //day doesn`t have a value here 

не устанавливает значение по умолчанию для day. Если day были переменную экземпляра (чтение переменной класса), то будет установлено значение по умолчанию 0, поэтому, внутри метода инициализации переменной ранее, чтобы использовать его:

int day = 0; 
0

Ваши присваивают значения day внутри if и else if Конструкции. Если все они будут false, переменная не получит никакого значения.

int day; - это просто декларация. Для его инициализации вы можете получить int day = 0;.

В качестве альтернативы вы можете иметь else в конце своего if и назначить ему значение day.

1

потому что вы назначаете значение в день в блоке if-else, но у вас не было блока else. поэтому, когда все условия в if-else не подходят, день не инициализируется. вам нужно добавить еще блок:

else { 
    day = ...; 
} 
0

Во-первых, вы должны указать значение по умолчанию в день с чем-то вроде int day = 1. Во-вторых, вы можете проверить, сколько дней в данный месяц/год имеет с java.util.Calendar как так -

java.util.Calendar cal = java.util.Calendar.getInstance(); 
cal.set(java.util.Calendar.YEAR, year); 
cal.set(java.util.Calendar.MONTH, month-1); // [... ] JANUARY which is 0. 
int maxDays = cal.getActualMaximum(Calendar.DAY_OF_MONTH); 
1

Я вижу две проблемы здесь:

(1). int day; // переменная дня, объявленная как int

Всякий раз, когда вы объявляете переменную. Инициализируйте его с некоторым значением. Как сказал мой товарищ ученый,

int day=-1; 

должна быть соответствующей.

(2). В,

private int getBirthdayYear() 
{ 
    Random r1 = new Random(); 
    int x = r1.nextInt(1000); 
    int year = 1000+ x; 
    return birthdayYear; 
    } 

Здесь, я не знаю, почему расчет выполняется на variable'year», когда вы возврат другой переменной„birthdayYear“(который я предполагаю, как глобальная переменная) из функция. Вы должны вернуть «год» оттуда, я полагаю.

Надеюсь, это поможет.

+0

Благодарим вас за то, что заметили другую ошибку, я разрезал и вставил строки и не понял, что мне нужно изменить переменный год на день рождения. – user2826974

0

Проблема в том, что вы инициализируете day с логикой, которая не имеет еще состояние.

Рассмотрим следующий очевидный пример:

int initMe; 

boolean willInit = false; 

if (willInit) { 
    initMe = 1; 
} 

System.out.println("initMe is " + initMe); 

Очевидно, что это не будет работать, потому что initMe не будет инициализирован в этой логике. Решение либо инициализировать его значение по умолчанию:

int initMe = -1; 

Или дать условиям в другое заявление:

if (willInit) { 
    initMe = 1; 
} else { 
    initMe = -1; 
} 

решение либо будет работать. Для вашей ситуации (где ваши условными, как представляется, решить, сколько дней в месяц) вы можете либо иметь еще для ситуации ошибки или рефакторинга, рефакторинга, так еще есть «по умолчанию»:

if (/* is February */) { 
    if (/* is a leap year */) { 

    } else { 
     /* it's not a leap year */ 
    } 
} else if (/* month has 31 days */) { 

} else { 
    /* presume it has 30 */ 
} 

В качестве примечания , Я заметил, что похоже на то, что вы пытаетесь «загромождать» входные значения с помощью метода Scanner#nextInt(int), но я не думаю, что это даст вам результаты, которые вы ожидаете. Параметр int фактически является аргументом radix. Так что что-то вроде nextInt(28) фактически указывает, что вход должен интерпретироваться как база номер.Если бы вы вошли, скажем, «15», сканер фактически вернет целое число со значением 33.

0
int i; // Declaration 
i = 0; // Initialization 
int i = 0; // Declaration + Initialization 
Смежные вопросы