缺少return语句编译器警告

时间:2017-10-06 11:55:11

标签: java compiler-errors return

此ProductDAO类返回用户的产品列表,但Netbeans中的编译器显示“缺少返回语句”。有进步吗?

public List<Product> doSelectAvailableProducts( String userid){
    Connection con = null; 
    Statement stmt = null; 
    ResultSet rs = null; 
    List<Product> cl = new ArrayList<Product>(); 
    try{ 
        con = datasource.getConnection(); 
    } 
    catch( SQLException e){ 
        e.printStackTrace(); 
    } 
  try{ 
      stmt = con.createStatement(); 
      String sql = "select * from Product where id not in " +"(select cid from registration where uid ='" + userid + "')";
      rs = stmt.executeQuery(sql); 
      while( rs.next() ){ 
        Product product = new Product(); 
        product.setId(rs.getInt("id")); 
        product.setName(rs.getString("name"));
        product.setDescription( rs.getString("description")); 
        product.setPrice( Double.parseDouble(rs.getString("price"))); cl.add(product); } 
      return cl; 
  } 
  catch( SQLException e ){ 
      e.printStackTrace(); 
  } 
  finally { 
      if(stmt != null) { 
          try { stmt.close();} 
          catch (Exception e) { e.printStackTrace(); } 
      } 
      if(con != null) { 
          try { con.close();}
          catch (Exception e) { e.printStackTrace(); }        
      }}  }

5 个答案:

答案 0 :(得分:1)

如果方法不是void方法(如此方法),则方法的所有可能分支都必须返回一些内容。在这种情况下,如果在第二个try块中抛出异常,则不会返回任何内容。

您可以将return cl语句移到方法的末尾而不是try块的末尾。

答案 1 :(得分:0)

无论发生什么(换句话说,在每个执行路径中),您都应该返回。

在每个不返回的分支中添加一个空列表的返回语句(或者你喜欢的任何默认值)。

就是这里:

catch( SQLException e ){ 
    e.printStackTrace(); 
    return new ArrayList<Product>();     // <--
}

答案 2 :(得分:0)

  

缺少退货声明Netbeans ProductDAO

你的try块返回 cl 但是catch block()中缺少return语句和方法 doSelectAvailableProducts 的结尾,它是JVM编写的时间通知,

  

如果你的方法返回了什么,那么它必须处理所有场景   归还。

List<Product> doSelectAvailableProducts result=object.doSelectAvailableProducts(aStringId);
if(result!=null){
// Do you next work flow here...
}

注意:返回引用,另一方面,你可能会得到 NullPointerException ,如果没有检查它

public List<Product> doSelectAvailableProducts( String userid){
    Connection con = null; 
    Statement stmt = null; 
    ResultSet rs = null; 
    List<Product> cl = new ArrayList<Product>(); 

    try{ 
        con = datasource.getConnection(); 
    } 
    catch( SQLException e){ 
        e.printStackTrace();
        return cl;
    } 
  try{ 
      stmt = con.createStatement(); 
      String sql = "select * from Product where id not in " +"(select cid from registration where uid ='" + userid + "')";
      rs = stmt.executeQuery(sql); 
      while( rs.next() ){ 
        Product product = new Product(); 
        product.setId(rs.getInt("id")); 
        product.setName(rs.getString("name"));
        product.setDescription( rs.getString("description")); 
        product.setPrice( Double.parseDouble(rs.getString("price"))); cl.add(product); } 
        return cl; 
  } 
  catch( SQLException e ){ 
      e.printStackTrace();
      return cl;
  } 
  finally { 
      if(stmt != null) { 
          try { stmt.close();} 
          catch (Exception e) { e.printStackTrace(); } 
      } 
      if(con != null) { 
          try { con.close();}
          catch (Exception e) { e.printStackTrace(); }        
      }}  return cl;}

答案 3 :(得分:0)

如果代码中的某些路径到达方法的末尾而未命中return语句,则会收到此警告,并且方法的返回类型不是无效。

您可以:添加一个return语句,抛出您正在捕获的异常之一,或者将该方法更改为不返回任何内容。

快速说明:代码格式化将帮助您更轻松地查看此类内容,并帮助那些了解您的代码之后的人。我已经格式化了下面的代码并添加了注释,显示了修复编译器错误的一些选项。

public List<Product> doSelectAvailableProducts( String userid){

  Connection con = null; 
  Statement stmt = null; 
  ResultSet rs = null; 
  List<Product> cl = new ArrayList<Product>(); 

  try{ 

    con = datasource.getConnection(); 

  } 
  catch( SQLException e){

    //throw this exception or add a return here?
    e.printStackTrace(); 
  } 

  try{ 

    stmt = con.createStatement(); 
    String sql = "select * from Product where id not in " +"(select cid from registration where uid ='" + userid + "')";

    //Exception might be thrown here, so the return statment below isn't reached
    //then all the code in the catch and finally run, but nothing is returned
    rs = stmt.executeQuery(sql);

    while( rs.next() ){ 
    Product product = new Product(); 
    product.setId(rs.getInt("id")); 
    product.setName(rs.getString("name"));
    product.setDescription( rs.getString("description")); 
    product.setPrice( Double.parseDouble(rs.getString("price"))); cl.add(product); }

    // Last return statement, never reached
    return cl;  

  } 
  catch( SQLException e ){ 

    //throw this exception or add a return here?
    e.printStackTrace();
  } 
  finally { 

    if(stmt != null) { 

      try {
        stmt.close();
      } 
      catch (Exception e) {
        e.printStackTrace(); 
      } 
    } 

    if(con != null) { 

      try {
        con.close();
      }
      catch (Exception e) {
        e.printStackTrace();
      }
    }

    //add a return here?
  }

  //add a return here?
}

答案 4 :(得分:-1)

你认为:

finally { 
      if(stmt != null) { 
          try { stmt.close();} 
          catch (Exception e) { e.printStackTrace(); } 
      } 
      if(con != null) { 
          try { con.close();}
          catch (Exception e) { e.printStackTrace(); } 

      }

    }  
      return null;

}

  }