此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(); }
}} }
答案 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;
}
}