【问题标题】:variable unreachable when using exceptions [duplicate]使用异常时变量无法访问[重复]
【发布时间】:2014-01-17 19:02:07
【问题描述】:

我对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 语句中返回,则错误消失并声明该函数应该返回。由于变量在函数内部,我会认为无论捕获如何,它都会允许这样做。谁能向我解释我哪里出错了?

【问题讨论】:

  • 声明“列表数据;”在 try 语句之外。
  • 您正试图在您声明它的块之外访问data。将声明移出 try 块。
  • 不,你的数据是在 try 中声明的。此外,read() 中没有其他名为 data 的变量。所以你会得到那个未解决的错误。
  • 这不会破坏使用异常的对象,因为没有任何东西可以捕获?还是这是使用异常的不好方法?
  • @LiamSorsby 这与异常无关。

标签: java exception-handling


【解决方案1】:

这很简单。问题是“数据”只存在于“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;
    }

【讨论】:

  • 感谢您的回答。我已投票支持关闭帖子,但如果我能够在帖子关闭之前将答案标记为正确,我会这样做。我不知道 try 块被归类为范围,但感谢您的帮助。
  • = null在失败的情况下其实很重要!
【解决方案2】:

你需要在同一个块中声明数据变量

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

【讨论】:

    【解决方案3】:
    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 语句所在的位置。

    【讨论】:

      【解决方案4】:

      对此非常简单的答案是:

      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 块内,或者也称为范围(我会坚持使用块)。在块内声明的所有内容都只能在该块内或在块内的块中访问。

      另一种解决方案如下。如果不需要,它会避免声明 (和初始化) 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;
      }
      

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

      【讨论】:

      • +1 获取更多信息。感谢您的意见。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2016-06-30
        • 2019-08-16
        • 1970-01-01
        • 2016-07-14
        • 1970-01-01
        • 2014-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多