将数据加载到java.util.Properties对象时出现NullPointerException

时间:2014-01-31 06:30:18

标签: java

注意:如果我的英文错误,请原谅我。

我正在学习java!现在我尝试将文件中的属性加载到java.util.Properties对象... 但我得到了一个例外。我按filename获取getClass().getResource("path/to/resource").toFile()并从中创建一个File对象;然后阅读内容。但是当我将InputStream文件发送到“加载”方法时,请获取NullPointerException

这是我的代码:

final class Main
{
    protected Properties config; 

    protected Properties getConfig()
    {
        if( this.config == null )
        {
            String filename = this.getClass().getResource("/tiny.properties").getFile();
            System.out.print(  filename+ "\n" );
            File f = new File( filename );

            try(InputStream propsFile = new FileInputStream( f ) )
            {
                int ch = 0;
                while( (ch = propsFile.read() ) != -1 )
                {
                   System.out.print((char) ch); // I can get ALL content of File Here
                }
                this.config.load( propsFile ); // But here I got NullPointerException!
            }
            catch(IOException exc)
            {
               assert true : "Can't read properties file!";
            }
        }
        return this.config;
     }
}

和我的例外:

Exception in thread "main" java.lang.NullPointerException
    at ir.teanlab.japp1.mavenproject1.Main.getConfig(Main.java:43) // this.config.load( ... )
    at ir.teanlab.japp1.mavenproject1.Main.getSqlConnection(Main.java:57)
    at ir.teanlab.japp1.mavenproject1.Main.<init>(Main.java:67)
    at ir.teanlab.japp1.mavenproject1.App.main(App.java:15)

4 个答案:

答案 0 :(得分:3)

您收到NullPointerException,因为调用config方法时load仍为空。您需要像这样初始化config对象:

config = new Properties();

可能最好把它放在你的空检查下面:

if( this.config == null ) 
{
    config = new Properties();
    ....

答案 1 :(得分:1)

您刚刚在此行Properties config;中创建了一个引用,但尚未创建对象

创建像Properties config=new Properties()

这样的对象

答案 2 :(得分:0)

尝试删除if条件(if(this.config == null))。 最终代码是:

final class Main
{
    protected Properties config; 

    protected Properties getConfig()
    {

        this.config=new new Properties();
            String filename =this.getClass().getResource("/tiny.properties").getFile();
            System.out.print(  filename+ "\n" );
            File f = new File( filename );

            try(InputStream propsFile = new FileInputStream( f ) )
            {
                int ch = 0;
                while( (ch = propsFile.read() ) != -1 )
                {
                   System.out.print((char) ch); // I can get ALL content of File Here
                }
                this.config.load( propsFile ); // But here I got NullPointerException!
            }
            catch(IOException exc)
            {
               assert true : "Can't read properties file!";
            }

        return this.config;
     }
}

答案 3 :(得分:0)

问题是您的config变量尚未初始化,因此仍为空。因此,在您的try / catch块中,您应该添加config = new Properties();

在旁注中,有一种更简单的方式来获取InputStream。我们使用以下技术(Java 6):

    InputStream inputStream = null;
    Properties config = null;
    try
    {
        config = new Properties();
        inputStream = this.getClass().getClassLoader().getResourceAsStream("path + resource name");
        if (inputStream != null)
        {
            config.load(inputStream);
        }
        else
        {
            throw new FileNotFoundException("property file '" + "path + resource name" + "' not found in the classpath");
        }
    }
    catch (IOException e)
    {
        throw new RuntimeException(e);
    }
    finally
    {
        if (inputStream != null)
        {
            try
            {
                inputStream.close();
            }
            catch (IOException e)
            {
                throw new RuntimeException(e);
            }
        }
    }

显然,使用java 7,您可以尝试使用资源。