使用异常时变量无法访问

时间:2014-01-17 19:02:07

标签: java exception-handling

我对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;
    }

但是我收到的错误是数据无法解析为变量。但是,如果我在try语句中返回错误消失并声明该函数应该返回。由于变量在函数内部,我会认为无论捕获它是否允许这样做。任何人都可以向我解释我哪里出错了吗?

5 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分: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;
}

答案 2 :(得分: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块之外声明您的变量。执行此操作时,可以在该try块之外访问它,例如,return语句为。

答案 3 :(得分: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;
}

这是因为datatry catch块中声明 ,或者它也称为范围(我会坚持阻止) 。在块内声明的所有内容都只能在此块内或内部块中进行接收。

另一种解决方案如下。如果不是必要的话,它可以避免声明(并初始化) 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;
}

但是我会坚持第一个解决方案!

答案 4 :(得分:0)

数据范围介于try子句的大括号之间,因此您无法在该范围之外访问它。您需要在try之外定义数据,以便在try之外返回它。