Java数组的共享对象初始化错误

时间:2017-08-06 00:44:08

标签: java arrays initialization

我有一个类Logger,它使用3个数组作为xhared变量 数组在构造函数中初始化 但是当在课程的任何其他方法中访问它们时,我得到了一个 的NullPointerException。

我需要知道原因和解决方案。

请参阅代码中的注释。

file Logger.java
package logger_010.standard;

import java.io.FileOutputStream;
import java.io.PrintStream;

public class Logger {

    // declaration
    private FileOutputStream[] files;
    private PrintStream[] pss;
    private String[] messages;

    public Logger() {
        // initialisation
        try {

            FileOutputStream[] files = { 
                    new FileOutputStream("G:\\Users\\TarekEZZAT\\Documents\\logs\\logger0.log"),
                    new FileOutputStream("G:\\Users\\TarekEZZAT\\Documents\\logs\\logger1.log"), 
                    new FileOutputStream("G:\\Users\\TarekEZZAT\\Documents\\logs\\logger2.log"), 
                    };

            PrintStream[] pss = { 
                    new PrintStream(files[0]), 
                    new PrintStream(files[1]), 
                    new PrintStream(files[2]),

            };

            String[] messages = {
                    new String ("Write error message to log file 0"),
                    new String ("Write error message to log file 1 + user"),
                    new String ("Write error message to log file 2 + user+ email"),
            };

            // Arrays instanciation is OK
            System.out.println(files[0].toString());
            System.out.println(files[1].toString());
            System.out.println(files[2].toString());
            System.out.println(pss[0].toString());
            System.out.println(pss[1].toString());
            System.out.println(pss[2].toString());
            System.out.println(messages[0].toString());
            System.out.println(messages[1].toString());
            System.out.println(messages[2].toString());
            System.out.println("++++++++++++");

        } catch (Exception e) {
            System.out.println("Exception " + e.getMessage());

        } finally {

        }
    }

    public void LogMessage(int level) {

        // Here I get a Null pointer exception

        System.out.println(files[0].toString());
        System.out.println(files[1].toString());
        System.out.println(files[2].toString());
        System.out.println(pss[0].toString());
        System.out.println(pss[1].toString());
        System.out.println(pss[2].toString());
        System.out.println(messages[0].toString());
        System.out.println(messages[1].toString());
        System.out.println(messages[2].toString());
        System.out.println("++++++++++++");

        // PrintStream[] files = OpenFiles();
        WriteLogMessage(this.getPss(), level);
        CloseFiles(pss);

    }

    private void CloseFiles(PrintStream[] pss2) {
        // TODO Auto-generated method stub

    }

    private PrintStream[] OpenFiles() {
        // TODO Auto-generated method stub
        return null;
    }

    private void WriteLogMessage(PrintStream[] files, int level) {

        this.getPss()[level].println(messages[level]);
        this.getPss()[level].flush();

    }

    public FileOutputStream[] getFiles() {
        return files;
    }

    public void setFiles(FileOutputStream[] files) {
        this.files = files;
    }

    public PrintStream[] getPss() {
        return pss;
    }

    public void setPss(PrintStream[] pss) {
        this.pss = pss;
    }

    public String[] getMessages() {
        return messages;
    }

    public void setMessages(String[] messages) {
        this.messages = messages;
    }

}

这是包含主要功能的文件

package logger_010.standard;

public class Start {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Logger l = new Logger();
        for (int i = 0; i < 15; i++) {
            int level = i % 2;
            l.LogMessage(level);
        }
    }

}

3 个答案:

答案 0 :(得分:1)

您在构造函数中声明了一个新文件,message,pss变量,而不是使用已经创建的class =&gt;的变量;在LogMessage方法中使用时,它使用变量not init =&gt;导致错误

答案 1 :(得分:1)

您永远不会将您的类属性绑定到您在构造函数中定义的对象。

通过定义FileOutputStream[] files = ...而不是files = ...,这是您的对象属性,您只是创建一个局部变量,其范围仅在构造函数内。

你的构造函数应该是:

public Logger() {
    // initialisation
    try {

        files = { 
                new FileOutputStream("G:\\Users\\TarekEZZAT\\Documents\\logs\\logger0.log"),
                new FileOutputStream("G:\\Users\\TarekEZZAT\\Documents\\logs\\logger1.log"), 
                new FileOutputStream("G:\\Users\\TarekEZZAT\\Documents\\logs\\logger2.log"), 
                };

         pss = { 
                new PrintStream(files[0]), 
                new PrintStream(files[1]), 
                new PrintStream(files[2]),

        };

         messages = {
                new String ("Write error message to log file 0"),
                new String ("Write error message to log file 1 + user"),
                new String ("Write error message to log file 2 + user+ email"),
        };

        // Arrays instanciation is OK
        System.out.println(files[0].toString());
        System.out.println(files[1].toString());
        System.out.println(files[2].toString());
        System.out.println(pss[0].toString());
        System.out.println(pss[1].toString());
        System.out.println(pss[2].toString());
        System.out.println(messages[0].toString());
        System.out.println(messages[1].toString());
        System.out.println(messages[2].toString());
        System.out.println("++++++++++++");

    } catch (Exception e) {
        System.out.println("Exception " + e.getMessage());

    } finally {

    }
}

答案 2 :(得分:0)

如果我使用FileOutputStream的子类和抛出FileNotFoundException的构造函数初始化FileOutputStream数组,我会收到此编译错误

&#34;默认构造函数无法处理隐式超级构造函数抛出的异常类型FileNotFoundException。必须定义一个显式的构造函数&#34;。

我终于使用函数(makeFileOutputStream)解决了这个问题,这个函数在try / catch块中调用FileOutputStream构造函数

这是我的Blogger课程的代码

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;

public class Logger {

    // declarations

    private FileOutputStream[] files = { 
            makeFileOutputStream("G:\\Users\\TarekEZZAT\\Documents\\logs\\logger0.log"),
            makeFileOutputStream("G:\\Users\\TarekEZZAT\\Documents\\logs\\logger1.log"),
            makeFileOutputStream("G:\\Users\\TarekEZZAT\\Documents\\logs\\logger2.log"), 
            };

    private PrintStream[] pss = { 
            new PrintStream(files[0]), 
            new PrintStream(files[1]), 
            new PrintStream(files[2]),
    };

    private String[] messages = { 
            new String("Write error message to log file 0"),
            new String("Write error message to log file 1 + user"),
            new String("Write error message to log file 2 + user+ email"), 
            };





    private FileOutputStream makeFileOutputStream(String string) {
        // TODO Auto-generated method stub
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(string);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return fos;
    }


    public void LogMessage(int level) {

        WriteLogMessage(this.getPss(), level);

    }


    public void CloseFile(PrintStream[] files, int level){
        // TODO Auto-generated method stub
        this.getPss()[level].close();

    }

    private void WriteLogMessage(PrintStream[] files, int level) {

        this.getPss()[level].println(messages[level]);
        this.getPss()[level].flush();
    }

    // Getters and Setters
    public FileOutputStream[] getFiles() {
        return files;
    }

    public void setFiles(FileOutputStream[] files) {
        this.files = files;
    }

    public PrintStream[] getPss() {
        return pss;
    }

    public void setPss(PrintStream[] pss) {
        this.pss = pss;
    }

    public String[] getMessages() {
        return messages;
    }

    public void setMessages(String[] messages) {
        this.messages = messages;
    }

}