2016-03-05 3 views
1

Я пытаюсь вернуть 2D-матрицу из функции. Eclipse, жалуется на тип возвращаемого значения функцииjava - метод return type confusion

import java.io.*; 
import java.util.Arrays; 
import java.util.List; 
import com.opencsv.CSVReader; 

public class myClass { 

    private static String inFile = "myfile.csv"; 

    private String[][] readCsv() { 
     File file1 = new File(inFile); 
     if (file1.exists()) { 
      System.out.println("File " + inFile + " exists. length : " + inFile.length()); 
     } else { 
      System.out.println("File " + inFile + " does not exist!"); 
     } 

     try { 
      // Read all 
      CSVReader csvReader = new CSVReader(new FileReader(new File(inFile))); 
      List<String[]> list = csvReader.readAll(); 

      // Convert to 2D array 
      String[][] dataArr = new String[list.size()][]; 
      dataArr = list.toArray(dataArr); 

      return dataArr; 
     } catch (Exception ex) { 
      // Do something with mistake or ignore 
      ex.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     myClass mc = new myClass(); 
     String[][] csvContents = mc.readCsv(); 

     for (int k = 0; k < 10; k++) { 
      System.out.println(Arrays.toString(csvContents[k])); 
     } 
    } 

} 

затмение ошибка говорит мне This method must return a result of type String[][]. Возвращаемое значение, dataArr имеет тип String[][] & Метод readCsv получил указание вернуть String[][].

Я не могу понять, где ошибка.

+3

Вы ничего не возвращаете, когда генерируется исключение. –

+2

Возможно, потенциально выгодно объявить исключения, которые могут возникнуть в этом методе в сводке метода. Таким образом, вам не нужна попытка улова, и вам не нужно возвращать фиктивное значение – ControlAltDel

ответ

5

Вы должны вернуть то, что в случае, если блок попытка генерирует исключение:

public String[][] myMethod() { 
    String[][] arr = new String[1][]; 
    try { 
     arr = methodThatCanThrowException(); // If this method throws an exception 
     return arr;       // this return will not execute 
    } catch (Exception ignored) {} 

    return arr;        // Return something after the try/catch block 
} 

Как вы справиться с этим до вас, вы можете вернуть значение по умолчанию или некоторые, возможно, null.

+0

Отлично. Спасибо, Марв – usert4jju7

2

Вы не возвращаете ничего, если исключение поймано в readCsv. Вам нужно что-то вернуть.

catch (Exception ex) { 
     // Do something with mistake or ignore 
     ex.printStackTrace(); 
     return SOMETHING; 
    } 
+0

Спасибо, Люк. – usert4jju7

+0

1) Ошибка компилятора происходит потому, что вы должны выполнить команду 'return dataArr;' * FROM FROM EACH POSSIBLE CODE PATH *. 2) Одним из вариантов является «return null;». Другой альтернативой является инициализация 'String [] [] dataArr = null;' вне вашего блока try/catch. 3) Возможно, решение * best * должно позволить readCsv генерировать исключение и позволить вашему высокоуровневому коду обрабатывать его. – paulsm4

+0

@ paulsm4 Является ли это направленным на меня или на ОП? Нет лучшего решения, это зависит от того, как OP хочет, чтобы метод работал. –

2

Когда исключение перехватывается и функция кода продолжается, нет возвращаемого значения

3

Метод должен возвращать String[][] в каждой возможной ветви. Здесь вы возвращаете его только из try - если он не завершился успешно и генерируется исключение, то catch завершит без возврата ничего, что приведет к ошибке. Вы можете просто return после блока примерки поймать, как @Marv предложил, но ИМХО, собственно Java-способом было бы просто позволить исключение отбрасываться из метода вместо того, чтобы ловить его:

// should probably throw something more specific 
private String[][] readCsv() throws Exception { 
    // Read all 
    CSVReader csvReader = new CSVReader(new FileReader(new File(inFile))); 
    List<String[]> list = csvReader.readAll(); 

    // Convert to 2D array 
    String[][] dataArr = new String[list.size()][]; 
    dataArr = list.toArray(dataArr); 

    return dataArr; 
} 
+0

Спасибо Mureinik – usert4jju7