为什么我在这里遇到了不安全或不安全的操作?

时间:2015-10-20 11:46:55

标签: java

我有两节课。其中一个类(Class_1)有一个返回List的方法:

class Class_1{
    ....
    public List<String> method_1(){
        Statement st = null;
        ResultSet res = null;
        List<String> tables = new ArrayList<String>();

        try {
            st = this.cnx.createStatement();
            res = st.executeQuery("SHOW TABLES");
            while(res.next()){
               tables.add(res.getString(1));
            }
        }
        catch(Exception e){
               e.printStackTrace();
        }        

        return tables;

    }
}

当我编译这个(Class_1)类时,我没有得到任何错误或警告。但我有另一个类Class_2,它使用这个第一类。在第二节课中,我有这样的代码行:

class Class_2{

    public static void main(String args[]){
        Class_1 c = new Class_1();
        List<String> some_list = c.method_1();
    }
}

当我编写上面的类(Class_2)时,我现在得到这些警告,我不喜欢压制:

  

注意:Class_2.java使用未经检查或不安全的操作

     

注意:使用-Xlint重新编译:取消选中以获取详细信息

我想知道为什么我会收到这些错误,因为在我看来一切都应该没问题 - 一种方法明确只返回List<String>,另一段代码尝试将此列表分配给变量输入List<String>。我看不出,这里有什么不安全的地方。

修改

当我用-XLint:unchecked编译我的Class_1时,我得到:

  

列出some_list = c.method_1();

                      ^
     

必需:列出[String]

     

发现:列表

为什么?

修改

我做了一些调查,发现整个问题都在这一行:

tables.add(res.getString(1));

它似乎是一个字符串,但编译器不喜欢它。所以,如果我只是切换到:

tables.add("Some real string");

然后我没有收到任何警告。真奇怪。

2 个答案:

答案 0 :(得分:2)

根据getStringhere ResultSet方法的文档,该方法:

  

返回:      列值;如果值为SQL NULL,则返回的值为null

在这种情况下,null中会插入List<String> tables。这似乎是编译器抱怨的内容。

在添加到getString之前,您应该检查null是否返回List<String> tables

答案 1 :(得分:0)

请检查导入和数组

import java.util.Arrays;
import java.util.List;
public class c1 {
    public List<String> method_1(){
        List<String> my_list = Arrays.asList("a1", "b2"); //<- got a list by some procedure
        return my_list;
    }
}

import java.util.List;
public class c2 {
    public static void main(String[] args) {
        c1 obj = new c1();
        List<String> s1 = obj.method_1();
        System.out.println(s1);
    }
}