2015-07-11 2 views
-1
package io; 

import java.io.*; 

public class UserIO { 

    public static void main(String[] args) { 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     char c; 
     try { 
      c = (char)br.read(); //Input a character from user 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     System.out.println("c: " + c); 
    } 
} 

Программа не может компилировать программу.Почему возникает ошибка «Локальная переменная, возможно, не была инициализирована»?

Error: The local variable c may not have been initialized

+2

Так инициализировать его - 'Char с = NULL;' – TDG

+0

Вы буквально говорит нам причину: Локальная переменная с может не были инициализированы. Инициализируйте его. В противном случае println() не будет иметь значения для использования в случае сбоя блока try. – runDOSrun

+2

@TDG, на Java, это не 'NULL', это' null'. – RealSkeptic

ответ

1

Intialize char c = '';.

Если ваш блок try не работает, ваш персонаж c не будет иметь никакого значения.

try { 
    c = (char)br.read(); //Input a character from user 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } 

Приведенный выше код не может присвоить любое значение c, если есть некоторые Exception выброшен в br.read(). Поэтому, когда для выполнения System.out.println("c: " + c); компилятор не знает, что печатать. Чтобы этого избежать, Java заставляет вас инициализировать локальные переменные.

Если вы проиндексируете c с char c = '';, даже если ваш блок try не работает, компилятор может как минимум печатать ``.

Вы должны быть в состоянии сделать что-то вроде:

char c; 
c = 'a'; 
System.out.println("c:" + c); 

В этом случае он будет успешно скомпилируется, так как при печати значение компилятор знает, что это будет, конечно, иметь какое-то значение, которое не так с вашим блоком try (он может иметь или не иметь значения).

+0

работает отлично после char c = ''; но почему попытка не срабатывала раньше? –

+0

@ArpitTomar Я добавил некоторое объяснение в ответ. Дайте мне знать, если у вас есть сомнения в этом. – Karthik

+0

понял теперь, ценю, что вы помогаете. –

0

Подумайте об этом: в случае отказа блока try, что будет распечатано на System.out.println("c: " + c)? Ну, независимо от стоимости c было до try -block. Какое значение заработало c перед блоком try? Ничего, вы не указали никакого предыдущего значения, значение не инициализируется. Следовательно, сообщение об ошибке.

Решение: Дайте c значение по умолчанию после объявления (или в блоке finally). Тот, который может использоваться в случае сбоя блока try.

+0

Возможно, вы захотите упомянуть, что этот эффект связан с тем, что 'c' является локальной переменной. Если 'c' было полем объекта, оно имело бы значение defaulf, так как' char' является примитивным. – Turing85

0

Вы должны действительно прочитать, что пользователь ввода после того, как они закончить

 while ((c = (char) br.read()) != -1) { 
       System.out.println("c: " + c); 
     } 
    } 
} 
+3

Вместо простого размещения кода, пожалуйста, объясните проблему с OP и решением.* Дайте человеку рыбу, и у него есть еда в течение дня. Научите человека ловить рыбу, и он никогда не будет голоден снова *. – Turing85

+0

Теперь вы вызываете br.read() вне try/catch-block. – runDOSrun