“使用未经检查或不安全的操作”

为什么每次编译时都会出现“使用未经检查或不安全的操作”错误? 代码有什么问题? 我复制了本教程中完全相同的代码http://www.mkyong.com/java/json-simple-example-read-and-write-json/

import java.io.FileWriter; import java.io.IOException; import org.json.JSONArray; import org.json.JSONObject; public class JsonSimpleExample { public static void main(String[] args) { JSONObject obj = new JSONObject(); obj.put("name", "mkyong.com"); obj.put("age", new Integer(100)); JSONArray list = new JSONArray(); list.add("msg 1"); list.add("msg 2"); list.add("msg 3"); obj.put("messages", list); try { FileWriter file = new FileWriter("c:\\test.json"); file.write(obj.toJSONString()); file.flush(); file.close(); } catch (IOException e) { e.printStackTrace(); } System.out.print(obj); } } 

当您执行Java编译器认为缺少错误检查的代码或以某种方式可能不安全的代码时,将显示uses unsafe or unchecked operations警告。 但是,这是一个警告,而不是错误,并且不会阻止您的代码编译 – 大型项目通常会在警告后生成警告,您可以自由决定是否值得采取行动。 如果您想深入了解导致警告触发的内容,可以使用语法javac -Xlint:unchecked yourfilename.java重新编译.java文件javac -Xlint:unchecked yourfilename.java ,编译器将为您提供更详细的信息,说明导致错误的确切原因。

根据我的经验,这种警告通常可以通过使用像ArrayList这样的东西而不指定它应该保持的类型(即使用ArrayList a = new ArrayList()而不是ArrayList a = new ArrayList() )。 在我的示例中,编译器警告您,您的代码不会检查您添加到它的值是否为任何特定类型。 在生产应用程序中,指定类型可能会很好,但在测试应用程序中,如果您不关心它们,则可以自由地忽略警告。

通常在构建generics类时会获得未经检查的强制转换,例如:

 // Here we have unchecked cast warning ArrayList arr = (ArrayList) obj;// obj is of type Object 

防止这种情况并使强制转换安全的一种方法是扩展强制转换的类型,然后使用自定义类型扩展,如下所示:

 // your class extends generic but is not generic class MyClass extends ArrayList { } //then change your cast like this: MyClass arr = (MyClass) obj;//here we have NO warning for unchecked cast