2015-10-20 79 views
2

我有兩個班。其中一個類(Class_1)的有一個返回列表的方法:爲什麼我在這裏沒有安全或不安全的操作?

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>的變量。我看不到,這裏有什麼不安全的。

編輯

當我編譯我的Class_1與-XLint:unchecked我得到:

列表some_list = c.method_1();

    ^

要求:列表[字符串]

發現:名單

這是爲什麼?

編輯

我做了一些調查,發現,整個問題是在這一行:

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

這似乎是一個字符串,但是編譯器不喜歡這一點。所以,如果我簡單地切換到:

tables.add("Some real string"); 

然後我得不到任何警告。真奇怪。

+5

我覺得有些東西你沒有告訴我們。你能包括更多細節嗎? –

+0

這看起來像你可能已經修剪你的代碼太多了。難道說Class_1實際上是一個類的參數嗎?如果你不提供這些,你也會得到這些錯誤 – Vogel612

+0

不,這些不是gerenric類。這是兩個非常簡單的類。 – Jacobian

回答

2

根據方法的ResultSetgetStringhere類方法的文檔:

返回: 列值;如果該值是SQL NULL,則返回值爲空

null插入List<String> tables這種情況下。這似乎是編譯器抱怨的。

在加入List<String> tables之前,您應該檢查getString是否返回null

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