2014-01-17 5 views
-2

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

У меня есть следующие функции

public static List<String[]> read(String document) throws IOException{ 
     try{ 
      CSVReader reader = new CSVReader(new FileReader(document)); 
      List<String[]> data = reader.readAll(); 
      reader.close(); 
     } catch(IOException e){ 
      e.printStackTrace(); 
     } 
     return data; 
    } 

однако я получаю сообщение об ошибке, что данные не могут быть разрешены к переменной. Однако, если i, но возвращение в заявлении try, ошибка исчезает и указывает, что функция должна возвращаться. Поскольку переменная находится внутри функции, я бы подумал, что независимо от улова это разрешило бы это. Может ли кто-нибудь объяснить мне, где я ошибаюсь?

+1

Объявить «Список данных;» вне инструкции try. – reblace

+0

вы пытаетесь получить доступ к «данным» вне блока, где вы его объявили. переместите объявление из блока try. – kmera

+0

Нет, ваши данные объявлены внутри try. Кроме того, в read() нет другой переменной с именем data. Таким образом, вы получаете эту ошибку. – Steam

ответ

4

Это довольно просто. Проблема в том, что «данные» существуют только в области «try». Вне этого он не определен. Простое решение может выглядеть следующим образом:

public static List<String[]> read(String document) throws IOException{ 

     List<String[]> data = null; 
     try{ 
      CSVReader reader = new CSVReader(new FileReader(document)); 
      data = reader.readAll(); 
      reader.close(); 
     } catch(IOException e){ 
      e.printStackTrace(); 
     } 
     return data; 
    } 
+0

Спасибо за ваш ответ.Я проголосовал за сообщение, которое нужно закрыть, но я буду отмечать ответ как правильный, если я смогу до того, как сообщение будет закрыто. Я не знал, что блок try был классифицирован как область действия, но спасибо за вашу помощь. –

+0

'= null' на самом деле очень важно в случае сбоя! – BrainStone

0

Объем данных находится между скобками предложения try, поэтому вы не можете получить к нему доступ за пределами этой области. Вам нужно определить данные за пределами попытки, чтобы вернуть ее за пределы попытки.

1

вам нужно объявить переменные данные в одном блоке

public static List<String[]> read(String document) throws IOException{ 
    List<String[]> data; 
    try{ 
     CSVReader reader = new CSVReader(new FileReader(document)); 
     data = reader.readAll(); 
     reader.close(); 
    } catch(IOException e){ 
     e.printStackTrace(); 
    } 
    return data; 
} 
1
public static List<String[]> read(String document) throws IOException{ 
    List<String[]> data = null; //Declare your variable here 
    try{ 
     CSVReader reader = new CSVReader(new FileReader(document)); 
     data = reader.readAll(); //Initialize your variable here 
     reader.close(); 
    } catch(IOException e){ 
     e.printStackTrace(); 
    } 
    return data; 
} 

Объявите переменный за пределами вашей Ьги блока. Когда вы это сделаете, он будет доступен за пределами этого блока try, например, где ваш оператор return.

1

Самый простой ответ на этот вопрос будет:

public static List<String[]> read(String document) throws IOException{ 
    List<String[]> data = null; 

    try{ 
     CSVReader reader = new CSVReader(new FileReader(document)); 
     data = reader.readAll(); 
     reader.close(); 
    } catch(IOException e){ 
     e.printStackTrace(); 
    } 

    return data; 
} 

Это потому, что data был объявлен внутри в try catch блок или как это также называется областью (я буду придерживаться блок). Все, что объявлено внутри блока, может быть доступно только внутри этого блока или внутри блоков, находящихся внутри.

Другим решением будет следующее. Это позволяет избежать объявляя (и initialzing) переменную data если не обязательны:

public static List<String[]> read(String document) throws IOException{ 
    try{ 
     CSVReader reader = new CSVReader(new FileReader(document)); 
     List<String[]> data = reader.readAll(); 
     reader.close(); 

     // Return early. Note this only happens when everything went right. 
     // (Which is what we hope for) 
     return data; 
    } catch(IOException e){ 
     e.printStackTrace(); 
    } 

    // This will only happen when it caught a exception! 
    return null; 
} 

Однако я бы прилипают к первому решению!

+0

+1 за дополнительной информацией. Спасибо за ваш вклад. –

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