Java [unchecked] unchecked case warning

2020-04-11 05:09发布

问题:

Ok, I've been looking around and done alot of google searching, but I still can't find a way to avoid this warning.

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);
  }

It gives me the warning at the line loadFile = (ArrayList)in.readObject(); I've added in the catchs so i'm not sure why it still says its uncatched. Any help? thanks?

回答1:

It is not "uncatched", but "unchecked". The JVM cannot tell at runtime, i.e. when the cast is done, whether the ArrayList really contains Dot elements.

This warning occurs whenever you cast from a raw type to a generic type. If you are sure the cast is ok, you can suppress the warning with annotation

@SuppressWarnings("unchecked")

For this, it is good to encapsulate the cast in a small, separate method.



回答2:

You are not checking whether the object returned by

in.readObject();

is really an

ArrayList<Dot>

Use

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


回答3:

It doesn't say uncatched (which correctly is spelled uncaught), but unchecked. You cannot avoid this warning when casting to a generic type, you can only suppress it. Or you can work around it:

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

With this method you can write:

loadFile = castToAnything(in.readObject());


回答4:

It means the compiler cannot check that the object you read in, matches the type you are casting it to. Thus the unchecked warning.

BTW: You might want to work on your error handling to make it simpler and clearer. ;)



回答5:

What you see is a compiler warning that you are trying to convert an Object into a ArrayList<Dot> without first checking if the Object actually contains a List of Dot and not e.g. a List of Foo.