【问题标题】:Java [unchecked] unchecked case warningJava [未选中] 未选中大小写警告
【发布时间】:2011-04-12 07:02:02
【问题描述】:

好的,我一直在环顾四周并进行了很多谷歌搜索,但我仍然找不到避免这个警告的方法。

Integer result = chooser.showOpenDialog(null);
if (result.equals(0))
{
    String tempHolder = chooser.getSelectedFile().getPath();
    filenameLoad = new File(tempHolder);
    filenameSave = filenameLoad;
    FileInputStream fis = null;
    ObjectInputStream in = null;
    try
    {
        fis = new FileInputStream(filenameLoad);
        in = new ObjectInputStream(fis);;
    }
    catch(IOException ex)
    {
        ex.printStackTrace();
    }

    try
    {
        loadFile = (ArrayList<Dot>)in.readObject();
    }
    catch(IOException ex)
    {
        System.out.println("Cast fail");
    }
    catch(ClassNotFoundException ex)
    {
        System.out.println("Cast fail");
    }
    catch (ClassCastException ex)
    {
        System.out.println("Cast fail");
    }

    try
    {
        in.close();
    }
    catch(Exception ex)
    {
        System.out.println("failed to close in");
    }
    save.setEnabled(true);
      gpanel.setDotList(loadFile);
  }

它在 loadFile = (ArrayList)in.readObject(); 行给了我警告我已经添加了捕获,所以我不确定为什么它仍然说它未捕获。有什么帮助吗?谢谢?

【问题讨论】:

  • loadFile 的声明是什么,警告的文本​​是什么?

标签: java uncaught-exception


【解决方案1】:

它不是“未捕获”,而是“未检查”。 JVM 无法在运行时判断,即当转换完成时,ArrayList 是否真的包含 Dot 元素。

每当您从原始类型转换为泛型类型时,都会出现此警告。如果你确定演员没问题,你可以用注释抑制警告

@SuppressWarnings("unchecked")

为此,最好将强制转换封装在一个小的、单独的方法中。

【讨论】:

    【解决方案2】:

    你没有检查对象是否返回

    in.readObject();
    

    真的是一个

    ArrayList<Dot>
    

    使用

    ArrayList<Dot> dotList = null;
    Object obj = in.readObject();
    if (obj instanceof ArrayList<Dot>)
    {
    dotList = (ArrayList<Dot>) obj;
    }
    

    【讨论】:

    • Eclipse 说:无法对参数化类型 ArrayList 执行 instanceof 检查。请改用 ArrayList> 的形式,因为更多的泛型类型信息将在运行时被删除。
    【解决方案3】:

    它不是uncatched(正确拼写为uncaught),而是unchecked。转换为泛型类型时,您无法避免此警告,您只能禁止它。或者你可以解决它:

    @SuppressWarnings("unchecked")
    public static <T> T castToAnything(Object obj) {
      return (T) obj;
    }
    

    用这个方法你可以写:

    loadFile = castToAnything(in.readObject());
    

    【讨论】:

    • 嘿,谢谢,我在我的程序中使用了这个,不再给我警告了,非常感谢!
    【解决方案4】:

    这意味着编译器无法检查您读入的对象是否与您将其转换为的类型匹配。因此,未经检查的警告。

    顺便说一句:您可能希望处理错误以使其更简单、更清晰。 ;)

    【讨论】:

    • 是的,我刚刚了解了 4 天前的异常,所以当我收到警告时,我认为这意味着我需要捕获异常,所以我什么都打了。
    • @marblecatdog,现在听起来不错。您可能会发现在所有代码周围没有少量捕获更好。
    【解决方案5】:

    您看到的是编译器警告,您正在尝试将 Object 转换为 ArrayList&lt;Dot&gt; 而没有首先检查 Object 是否实际包含点列表而不是例如Foo 列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      相关资源
      最近更新 更多