为什么每次编译时都会出现“使用未经检查或不安全的操作”错误?代码有什么问题?我复制了本教程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);
}
}
答案 0 :(得分:39)
当您执行Java编译器认为缺少错误检查的代码或以某种方式可能不安全时,会显示uses unsafe or unchecked operations
警告。但是,这是一个警告,而不是错误,并且不会阻止您的代码编译 - 大型项目通常会在警告后生成警告,您可以自由决定是否值得采取行动。如果您想深入了解导致警告触发的内容,可以使用语法.java
重新编译javac -Xlint:unchecked yourfilename.java
文件,编译器将为您提供更详细的信息,说明导致错误的确切原因
根据我的经验,这种警告通常可以通过使用像ArrayList这样的东西而不指定它应该保持的类型(即使用ArrayList a = new ArrayList()
而不是ArrayList<String> a = new ArrayList<String>()
)来引起。在我的示例中,编译器警告您,您的代码不会检查您添加到它的值是否为任何特定类型。在生产应用程序中,指定类型可能会很好,但在测试应用程序中,如果您不关心它们,则可以自由地忽略警告。
答案 1 :(得分:0)
通常在投射通用类时会获得未经检查的强制转换,例如:
// Here we have unchecked cast warning
ArrayList<String> arr = (ArrayList<String>) obj;// obj is of type Object
防止这种情况并使强制转换安全的一种方法是扩展强制转换的类型,然后使用自定义类型扩展,如下所示:
// your class extends generic but is not generic
class MyClass extends ArrayList<String> { }
//then change your cast like this:
MyClass arr = (MyClass) obj;//here we have NO warning for unchecked cast
答案 2 :(得分:0)
我通过更新项目级别gradle文件中的类路径版本来解决此问题
classpath 'com.google.gms:google-services:4.2.0'