HashMap (ключ: Строка, значение: ArrayList), возвращает Объект вместо ArrayList?

«Использовать исключения» против «Использовать коды ошибок» никогда не бывает таким четким, как показывают примеры.

Использовать коды ошибок для выполнения программы. Если у вас есть ожидаемая ошибка, не создавайте исключение. Например. вы читаете файл, вы можете выдать исключение для «файл не найден» , «файл заблокирован» ; но никогда не бросайте один для "конец файла" .

Если вы это сделаете, вы никогда не сможете писать простые циклы, вы всегда будете заключать код в обработчики исключений. И не забывайте, что исключения очень медленные, это особенно важно для больших многопоточных серверов. (Это не так важно в вашем настольном приложении).

1120 Во-вторых, будьте очень осторожны с иерархиями исключений. Вы можете подумать, что нормально иметь класс Exception, затем извлечь из него NetException, а затем SMTPException для своего класса SMTP. Но если вы не храните общие данные в базовом классе, вам всегда придется перехватывать все типы исключений в этой иерархии. Например. если вы указали причину ошибки SMTP в своем классе SMTPException, вы должны ее уловить - если вы только поймаете типы Exception, у вас не будет доступа к членам SMTPException. Хороший способ решения этой проблемы - иметь строку и член int в базовом классе исключений и использовать их только для производных типов. К сожалению, std::exception предлагает только строку: (

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

Если вы используете исключения, вы должны потрудиться, чтобы заполнить их большим количеством данных, чем было бы с кодом ошибки. В случае ошибок вы должны немедленно обработать их, или они потерялись в коде. За исключением, это может быть поймано на много уровней от того места, где он был брошен - как в примере Родди. Вызывается DoC и получает исключение 2 уровня из DoA. Если вы не укажете ошибку, специфичную для кода в DoA, вы можете Я думаю, что он был сгенерирован из функции DoB. (простой пример, но я видел код, где исключение обрабатывалось на многих уровнях вниз по стеку вызовов. Для отладки было ab st . Это особенно относится к ОО-программам)

Так что, надеюсь, я дал вам достаточно для размышлений. Простая правда в том, что стиль означает, что нет вещь в обработке ошибок, практичность это все. Если вы должны размещать операторы журнала везде, где может произойти ошибка, сделайте это. Гораздо важнее то, что вы можете видеть, где код работал неправильно (и с какими данными работали), чем ваша элегантная иерархия исключений или вы засоряли свой код обработчиками исключений. Если вы не можете легко отследить ошибку, ваш код обработки ошибок бесполезен.

1124 Исключения хороши, используйте их. Но подумайте о том, что вы делаете, не злоупотребляйте ими и не злоупотребляйте ими. Неправильно используемое исключение хуже, чем отсутствие обработки ошибок вообще (поскольку вы можете получить аварийный дамп и просмотреть необработанное исключение, чтобы найти ошибку за считанные секунды. За исключением исключения, которое съедено и проигнорировано, вы набиты).

За эти годы я обнаружил, что самым большим помощником в отладке является логирование. Пишите логи, пишите много логов.

6
задан cksubs 6 June 2009 в 23:35
поделиться

5 ответов

Как объявление HashMap выражается в этой области? Это должно быть:

HashMap<String, ArrayList> dictMap

Если нет, предполагается, что это объекты.

Например, если ваш код:

HashMap dictMap = new HashMap<String, ArrayList>();
...
ArrayList current = dictMap.get(dictCode);

, это не сработает. Вместо этого вы хотите:

HashMap<String, ArrayList> dictMap = new HashMap<String, Arraylist>();
...
ArrayList current = dictMap.get(dictCode);

Универсальные шаблоны работают так, что информация о типах доступна компилятору, но недоступна во время выполнения. Это называется стиранием шрифта. Реализация HashMap (или любой другой реализации дженериков) имеет дело с Object. Информация о типе используется для проверки безопасности типов во время компиляции. См. Документацию Generics .

Также обратите внимание, что ArrayList также реализован как универсальный класс, и поэтому вы можете также указать здесь тип. Предполагая, что ваш ArrayList содержит ваш класс MyClass , строка выше может быть такой:

HashMap<String, ArrayList<MyClass>> dictMap
37
ответ дан 8 December 2019 в 02:04
поделиться
public static void main(String arg[])
{
    HashMap<String, ArrayList<String>> hashmap = 
        new HashMap<String, ArrayList<String>>();
    ArrayList<String> arraylist = new ArrayList<String>();
    arraylist.add("Hello");
    arraylist.add("World.");
    hashmap.put("my key", arraylist);
    arraylist = hashmap.get("not inserted");
    System.out.println(arraylist);
    arraylist = hashmap.get("my key");
    System.out.println(arraylist);
}

null
[Hello, World.]

Отлично работает ... возможно, вы нашли свою ошибку в моем коде.

11
ответ дан 8 December 2019 в 02:04
поделиться

Я полагаю, что ваш dictMap имеет тип HashMap , что делает его значением по умолчанию HashMap . Если вы хотите, чтобы он был более конкретным, объявите его как HashMap или, что еще лучше, как HashMap >

2
ответ дан 8 December 2019 в 02:04
поделиться

Лучше всего использовать дженерики (как в ответах выше). Я только что дважды проверил, и:

    test.put("test", arraylistone); 
    ArrayList current = new ArrayList();
    current = (ArrayList) test.get("test");

тоже будет работать, хотя я бы не рекомендовал его, поскольку универсальные шаблоны гарантируют, что добавляются только правильные данные,

2
ответ дан 8 December 2019 в 02:04
поделиться

Метод get для HashMap возвращает объект , но переменная current ожидается получение ArrayList :

ArrayList current = new ArrayList();
// ...
current = dictMap.get(dictCode);

Для работы приведенного выше кода объект должен быть преобразован в ArrayList :

ArrayList current = new ArrayList();
// ...
current = (ArrayList)dictMap.get(dictCode);

Однако, вероятно, Лучше всего было бы использовать в первую очередь общие объекты коллекции:

HashMap<String, ArrayList<Object>> dictMap =
    new HashMap<String, ArrayList<Object>>();

// Populate the HashMap.

ArrayList<Object> current = new ArrayList<Object>();      
if(dictMap.containsKey(dictCode)) {
    current = dictMap.get(dictCode);   
}

В приведенном выше коде предполагается, что ArrayList имеет список Object s, и его следует изменить как

Для получения дополнительной информации о дженериках, в The Java Tutorials есть урок по дженерикам .

2
ответ дан 8 December 2019 в 02:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: