问题
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.
来源:https://stackoverflow.com/questions/5631537/java-unchecked-unchecked-case-warning