【问题标题】:Unchecked or unsafe operations at ObjectInputStreamObjectInputStream 上未经检查或不安全的操作
【发布时间】:2016-05-14 19:40:55
【问题描述】:

我在此方法中收到“未经检查或不安全的操作”错误:

public static MyClass initApp(){
        MyClass obj = new MyClass(); 
        try{
            ObjectInputStream oin = 
                new ObjectInputStream(new FileInputStream("file.dat"));

            obj.setSomeList ( (Map<String,MyOtherClass>) oin.readObject()); //error line

        }catch(IOException e)
            { System.out.println(e.getMessage()); }
         catch(ClassNotFoundException e)
            { System.out.println(e.getMessage()); }

        return obj; 
    }

在这种情况下,地图不是尽可能抽象吗?我该如何解决这个问题?

方法 setSomeList(注意!它被放在另一个类中!如果有帮助的话):

public void setSomeList(Map<String,MyOtherClass> l){
        for(Map.Entry<String,MyOtherClass> entrada : l.entrySet())
            someList.put(entrada.getKey(),entrada.getValue().clone());
    }

【问题讨论】:

  • 现在你只是假设从流中读取的对象是一个 Map。您应该在转换之前仔细检查读取的对象的类。
  • @CConard96 如何在 ObjectInputStream“环境”中做到这一点?
  • idk 你在想什么,但你为什么要使用 oin.readObject(),你能告诉我
  • 向我们展示 setSomeList 方法
  • @holidayCoder 因为如果我没有不兼容的类型错误

标签: java compiler-warnings objectinputstream


【解决方案1】:

这只是一个警告,您可以简单地忽略它,因为它不会阻止您的应用程序工作,除非它不是正确的类型,如果您想删除它,只需在方法定义级别添加 @SuppressWarnings("unchecked"),如下面:

@SuppressWarnings("unchecked")
public static MyClass initApp(){

【讨论】:

  • 就没有别的办法了吗?
  • 不,因为您将 Object 转换为 Map,这是编译器工作的一部分,警告您它可能会失败,但如果您知道它是安全的,您只需添加一个警告,这是一个说好的没问题的方式我知道我在做什么
【解决方案2】:

你应该在转换之前检查对象类型。

Object theObject = obj.readObject();
if (theObject instanceof Map)
{
    Map theMap = (Map) theObject;
    objSetSomeList(theMap);
}

【讨论】:

  • 由于类型擦除,无法检查代码中该点的键或值的类型。请参阅stackoverflow.com/questions/7335018/… 了解更多信息。你能做的最好的就是转换为通用 Map,获取第一个条目,使用 instanceof 检查键和值的类型。
  • 好的,明白了。谢谢;)
猜你喜欢
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多