2014-01-14 3 views
2

начинающий Java-кодер здесь. Вот код:Непроверенный бросок - должен ли я подавить это?

private ArrayList<Rectangle> rectangles; 
try { 
     InputStream IS = MyClass.class.getResourceAsStream("file.dat"); 
     ObjectInputStream input = new ObjectInputStream(IS); 
     rectangles = (ArrayList<Rectangle>) input.readObject(); 
} catch (IOException | ClassNotFoundException ex) { 
     System.out.println(ex); 
} 

Netbeans говорит мне, что это непроверенный актерский состав. Google говорит мне, что я должен стараться избегать этого предупреждения, а не подавлять его, поэтому как бы я это сделал? Единственные файлы, которые должна быть прочитана этой программой, действительно содержат ArrayList, и если нет, я в порядке, просто перехватывая эти исключения.

Кроме того, если я делаю то же самое с char [] [] (прочитайте его и OIS и попробуйте сделать), netbeans не имеет никаких проблем с ним. Почему это? Я бы подумал, что это все еще неконтролируемый актерский состав.

ответ

2

Вы должны только подавлять предупреждение, если знаете, почему оно есть. В этом случае, поскольку кажется, что вы понимаете проблему и предпринимаете шаги для ее устранения, то подавление ее, вероятно, хорошо. Если, однако, вы Хеллбент о внесении предупреждение уйти, единственный метод, который я нашел, чтобы сделать это в данном случае это сделать что-то вроде этого:

public class ListOfRectangles extends ArrayList<Rectangle> {} 

И затем использовать ListOfRectangles в качестве типа данных для сериализации в файл и из него.

Причина, по которой компилятор в порядке с char [] [], а не ArrayList<Rectangle>, объясняется концепцией Java-дженериков, известной как стирание. Это означает, что для типичных типов (например, ArrayList) параметризованный тип (Rectangle в этом случае) фактически не присутствует в байте-коде. Он присутствует только во время компиляции, поэтому компилятор может дважды проверить вашу работу. Это не относится к массивам.

Существует более глубокий взгляд на дженерики here

1

Иногда это просто невозможно или слишком сложно избежать броска. Любыми способами старайтесь избегать их, всегда назначая проверенные типы. Но если вы не можете, то просто подавите его. ИМХО.

В этом случае вполне законно подавлять его. Это лучше, чем возвращение Object.

1

Всегда старайтесь избегать этого предупреждения, а не подавлять его, тем самым он снижает вероятность ошибки во время выполнения.

+0

Ошибка выполнения - это то, что поставлено на карту с проверенным или неконтролируемым произведением. Единственное различие - точное местоположение этой ошибки. –

1

Избегайте, если это возможно, документ, если нет. Вот так, что Джош Блох рекомендует документирование (Effective Java, 2-е изд, пункт 26):

private ArrayList<Rectangle> rectangles; 
try { 
     InputStream IS = MyClass.class.getResourceAsStream("file.dat"); 
     ObjectInputStream input = new ObjectInputStream(IS); 

     //The input stream is definitely an ArrayList<Rectangle> 
     //I know this because............... 
     @SuppressWarnings("unchecked") 
     ArrayList<Rectangle> rectangles2 = (ArrayList<Rectangle>) input.readObject(); 
     rectangles = rectangles2; 

} catch (IOException | ClassNotFoundException ex) { 
     System.out.println(ex); 
} 

Это локализует подавление на пару строк кода, а не всей функции.

+0

Скажите, что у вас есть ошибка для исправления. Будете ли вы доверять комментарию и уйти? Если ваш ответ «да», то вы не выполняете задачу отладки. Другими словами, забывайте комментировать. –

+1

Лучше, черт возьми, хороший и полезный комментарий, в противном случае это * не * заслуживает доверия. Если это не помогает при отладке, ее не должно быть. – aliteralmind

+0

Комментарии и код имеют свои собственные отдельные жизни. Должен ли я, возможно, перебирать историю git, чтобы сначала проследить первоначальную фиксацию, добавившую комментарий, а затем выполнить любые изменения, чтобы решить для каждого из них, поддерживает ли он свойства, указанные в комментарии? Ни в коем случае, я трачу свое время, фактически проверяя, что делает код. Фактически, требуется практика, чтобы узнать, как ** полностью и полностью игнорировать ** комментарий, чтобы прекратить, если из-за того, что вы сбились с пути во время чтения кода. Это мне плохо. –

0

Может быть законным подавлять предупреждение. Например, если вы абсолютно уверены в сериализованном формате, вы можете его подавить.

Однако, если вы не уверены, потому что кто-то другой создал сериализованный формат, или вы считаете, что формат может развиваться со временем, вы можете проверить содержимое без каких-либо небезопасных бросков.

List<?> untyped = (List<?>) input.readObject(); 
List<Rectangle> rectangles = new ArrayList<>(untyped.size()); 
for (Object obj : untyped) 
    rectangles.add((Rectangle) obj); 

Это будет гарантировать, что если элемент не является Rectangle, в результате ClassCastException будет сгенерировано сразу, на месте явного приведения, а где-то позже, в месте, где не выполняется никаких видимых литая.

Смежные вопросы