Java HashMap в файл и файл в HashMap выводит null

Привет, ребята, я новичок в разработке, на этом форуме и хотел создать зеркало для входа. Мне пришлось использовать BlueJ из-за моего учителя, и да ... это, наверное, не один из лучших способов научиться писать, я думаю (версия, которую мы должны использовать в школе, даже не показывает ошибок перед компиляцией) (я лично начал писать с Eclipse ).

Моя проблема в том, что вывод, который я получаю от моего hasMapReader, просто равен нулю после того, как я «сохранил» HashMap в новом файле и «записал» его в другой HashMap.

HashMap<String, Serializable> userAcc = new HashMap<String, Serializable>();
userAcc.put(name, value);

otherClass.hashMapSaver(userAcc, hashMapFile = new java.io.File(location));



    public HashMap<String, Serializable> hashMapSaver(HashMap<String, Serializable> map, java.io.File file){
            try{   
    FileOutputStream f = new FileOutputStream(file);  
    ObjectOutputStream s = new ObjectOutputStream(f);          
    s.writeObject(map);

    s.close();
    f.close();

    }catch (IOException e) { 
       e.printStackTrace(); 
    }
    return map;
    }




   HashMap<String, Serializable> userAcc2 = new HashMap<String, Serializable>();
   otherClass.hashMapReader(userAcc2, new java.io.File(hashMapFile));

(userAcc2 находится в третьем «основном» классе) затем hashMapReader в другом классе:

 public HashMap<String, Serializable> hashMapReader(HashMap<String, Serializable> map2, java.io.File file){

    try{   
    FileInputStream f = new FileInputStream(file);  
    ObjectInputStream s = new ObjectInputStream(f);          
    map2 = (HashMap<String, Serializable>) s.readObject();
    f.close();
    s.close();


    }catch (IOException e) { 
       e.printStackTrace(); 
       return null;
    }  catch (ClassNotFoundException c) {
     c.printStackTrace();
     return null;
    }
    return map2;
}



System.out.println("userAcc2: " + userAcc2.get(name));
System.out.println("HashMap Keys: " + userAcc2.keySet());

но консоль просто распечатывает:

userAcc2: null; Ключи HashMap: []

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

Я пытаюсь решить это почти неделю.

Спасибо :),

Вы вводите null в свои блоки catch. (1) Возникает ли исключение? (2) Действительно ли вызывается метод? И где переменные, на которые есть ссылки в создаваемых строках печати?

ifly6 27.06.2018 23:01

Прочтите ericlippert.com/2014/03/05/how-to-debug-small-programs, чтобы узнать, как отлаживать код.

Code-Apprentice 27.06.2018 23:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш map2 является аргументом в hashMapReader, но в этом методе вы выполняете следующее назначение:

map2 = (HashMap<String, Serializable>) s.readObject();

Это обновляет переменную map2, но не объект, на который ссылается map2. Поскольку hashMapReader возвращает map2, следующее изменение решит вашу проблему:

userAcc2 = otherClass.hashMapReader(userAcc2, new java.io.File(hashMapFile));

В качестве побочного примечания аргумент map2 совершенно не нужен, поскольку вы все равно не используете передаваемый объект. Что-нибудь чуть чище было бы:

public HashMap<String, Serializable> hashMapReader(java.io.File file){
    HashMap<String, Serializable> map2 = null;
    try{   
        FileInputStream f = new FileInputStream(file);  
        ObjectInputStream s = new ObjectInputStream(f);          
        map2 = (HashMap<String, Serializable>) s.readObject();
        f.close();
        s.close();
    } catch (IOException e) { 
        e.printStackTrace(); 
        return null;
    } catch (ClassNotFoundException c) {
        c.printStackTrace();
        return null;
    }
    return map2;
}

...
userAcc2 = otherClass.hashMapReader(new java.io.File(hashMapFile));

Другие вопросы по теме