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

时间:2014-05-20 01:47:10

标签: java

为什么每次编译时都会出现“使用未经检查或不安全的操作”错误?代码有什么问题?我复制了本教程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);
    }
}

3 个答案:

答案 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'