【问题标题】:getProperty() always returns null - JavagetProperty() 始终返回 null - Java
【发布时间】:2018-05-23 09:14:25
【问题描述】:

在下面的代码中,getProperty() 方法总是返回 null,即使我为

添加了默认值
loadNumberOfAccounts();

所以它不是 null,下一个使用 getProperty() 的方法将返回 null。 存储属性完美无缺。

prop.get

也返回 null。

public class AccountList {

    private static Properties prop = new Properties();
    private static final File DIRECTORY = Constants.DIRECTORY;
    private static final File BANK_ACCOUNTS_FILE = new 
    File(DIRECTORY.getName() + File.separator + "Accounts.txt");
    private static final FileOutputStream WRITER = assignWriter();
    private static final FileInputStream READER = assignReader();
    private static final List<Bank> ACCOUNT_LIST = new ArrayList<>();
    private static final String NUMBER_OF_ACCOUNTS = "NumberOfAccounts";
    private static final String BANK_ACCOUNT_NAME = "BankAccount";
    private static final String SEPERATOR = "-";
    private static int accounts = 0;
    static {
    BANK_ACCOUNTS_FILE.setReadOnly();
    }

    private static FileInputStream assignReader() {
        FileInputStream tmp = null;

        try {
            tmp = new FileInputStream(BANK_ACCOUNTS_FILE);
        } catch (FileNotFoundException e) {
            EvaluateErrors.eveluateException(e);
        }

        if (tmp == null) {
            EvaluateErrors.eveluateException(new NullPointerException());
        }

            return tmp;

    }

    private static FileOutputStream assignWriter() {
        BANK_ACCOUNTS_FILE.setWritable(true);
        FileOutputStream tmp = null;

        try {
            tmp = new FileOutputStream(BANK_ACCOUNTS_FILE);
        } catch (IOException e) {
            EvaluateErrors.eveluateException(e);
        }
        if (tmp == null) {
            EvaluateErrors.eveluateException(new NullPointerException());
        }

        BANK_ACCOUNTS_FILE.setReadOnly();
        return tmp;
    }

    public static void loadAccounts() {
        try {
                prop.load(READER);
        } catch (IOException e) {
            EvaluateErrors.eveluateException(e);
        }

        loadNumberOfAccounts();
        loadAccountsList();
        for (Bank object : ACCOUNT_LIST) { //to try and debug
            System.out.println(object.getName());
            System.out.println(object.getId());
            System.out.println(object.getBankAccountFunds());
            System.out.println(object.getOverdrawFee());

        }

    }

    public static void saveAccounts() {
        BANK_ACCOUNTS_FILE.setWritable(true);
        saveAccountsList();
        saveNumberOfAccounts();
        try {
                prop.store(WRITER, null);
        } catch (IOException e) {
            EvaluateErrors.eveluateException(e);
        } finally {
            CloseLogs();
            BANK_ACCOUNTS_FILE.setReadOnly();
        }
    private static void loadNumberOfAccounts() {

        String string = prop.getProperty(NUMBER_OF_ACCOUNTS);
        System.out.println(string); // always null
        try {
            accounts = Integer.parseInt(string);
        } catch (NumberFormatException e) { // this exception is thrown 
        // because string is always null. 
            EvaluateErrors.eveluateException(e);
        } 
// more methods ...

我确定答案很简单,我只是错过了它,但我已经用尽了所有选项。

Accounts.txt 看起来像这样

NumberOfAccounts=1
OtherStoredProperties=etc
etc...

更新

我发现了这个错误,但不知道为什么会发生,也不知道如何修复它。

事实证明,如果我改变了

private static final WRITER = assignWriter();

WRITER = null 

getProperty() 方法完美无缺。我在尝试存储属性文件时显然会得到一个NullPointerException,因为WRITER = null,但是,这是一个简单的修复。我不明白的是,为什么分配WRITER 会导致getProperty() 方法只返回n​​ull?

【问题讨论】:

  • 您确定加载属性文件不会失败吗?您正在使用名为EvaluateErrors.eveluateException(e) 的东西来捕获IOException,但仍不清楚。如果你只是为了调试而使用e.printStacktrace() 会发生什么?
  • @AKSW EvaluateErrors.eveluateException() 显示一个 Jdialog 说您的程序已崩溃,它强制关闭程序并将 stackTrace 写入我的 logs.txt 文件中。但是我只是用e.printStacktrace() 尝试过,除了NumberFormatException 之外,它没有发现异常

标签: java properties getproperty getproperties


【解决方案1】:

您可以轻松设置和获取用于限制访问的键值对。当您将代码推送到 github 等远程 git 上时,它是安全的。

查看下面的完整代码:

  1. Config.java 类

    导入 java.io.*; 导入 java.util.Properties;

    公共类配置{

    Properties p;
    final String filename = "config.properties";
    
    public Config() throws FileNotFoundException {
    }
    
    //Storing environmental values
    public void setConfigValues() throws IOException {
        OutputStream os = new FileOutputStream(filename);
        p = new Properties();
        p.setProperty("name","Anand");
        p.setProperty("age","27");
        p.store(os, null);
    }
    
    //retrieving environmental values
    public String getConfigValues(String key) throws IOException {
        InputStream is = new FileInputStream(filename);
        p = new Properties();
        String name;
    
        p.load(is);
        name = p.getProperty(key);
        return name;
    }
    

    }

  2. Main.java 类

    导入 java.io.IOException;

    public class Main {
    
        public static String propertyValue;
    
        public static void main(String[] args) throws IOException {
    
            Config cfg = new Config();
            cfg.setConfigValues();
            propertyValue = cfg.getConfigValues("name");
            System.out.println(propertyValue);
            System.out.println(cfg.getConfigValues("age"));
        }
    
    }
    

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 2016-01-21
    • 2016-05-31
    • 2015-08-15
    • 2012-03-18
    • 2016-11-04
    • 2016-07-28
    相关资源
    最近更新 更多