2016-03-05 64 views
1

我試圖從一個函數返回一個二維矩陣。 Eclipse抱怨功能的返回類型java - 方法返回類型混淆

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])); 
     } 
    } 

} 

錯誤eclipse告訴我的是This method must return a result of type String[][]。正在返回的值dataArr的類型爲String[][] &方法readCsv被指示返回String[][]

我無法弄清楚錯誤在哪裏。

+3

拋出異常時不會返回任何內容。 –

+2

在方法摘要中聲明可能發生在此方法中的異常可能是有利的。這樣,你不需要嘗試捕捉,你不需要返回一個虛假值 – ControlAltDel

回答

5

你將不得不返回的東西的情況下,try塊拋出異常:

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

優秀。謝謝Marv – usert4jju7

2

如果在readCsv中發現異常,您不會返回任何東西。你需要在這裏返回一些東西。

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

謝謝盧克。 – usert4jju7

+0

1)編譯器錯誤發生,因爲你必須明確'返回dataArr;'*從每個可能的代碼路徑*。 2)一種選擇是'返回null;'。另一種方法是在try/catch塊之外初始化String [] [] dataArr = null;'。 3)可以說*最好的解決方案是允許readCsv拋出異常,並讓你的高級代碼處理它。 – paulsm4

+0

@ paulsm4這是針對我還是OP?沒有最好的解決方案,它取決於OP如何使用該方法。 –

2

當一個異常被捕獲和代碼功能繼續,沒有返回值

3

的方法必須在每個可能的分支返回String[][]。在這裏,您只能從try中返回 - 如果它沒有成功完成並拋出異常,則catch將完成而不返回任何內容,從而導致錯誤。你可以只return的try-catch塊後,像@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