Java 静态属性上的NullPointerException

Java 静态属性上的NullPointerException,java,arrays,filereader,Java,Arrays,Filereader,我正在用java创建一个简单的登录程序。这是我到目前为止的代码 import java.util.Scanner; import java.io.*; import java.util.Arrays; public class PasswordProgram { public static String user; public String password; public static boolean part1Finish = false; public

我正在用java创建一个简单的登录程序。这是我到目前为止的代码

import java.util.Scanner;
import java.io.*;
import java.util.Arrays;

public class PasswordProgram {

    public static String user;
    public String password;
    public static boolean part1Finish = false;
    public File file = new File("D:/file.txt");
    public FileWriter UsernameWrite;
    public char[] user1;

    public void part1() {
        System.out.println("Please create an account: ");
        Scanner input = new Scanner(System. in );
        System.out.println("Type in a username: ");
        String user = input.next();

        System.out.println("Type in a Password: ");
        String password = input.next();
        try {
            UsernameWrite = new FileWriter(file);
            UsernameWrite.write(user);
            UsernameWrite.write(password);
            System.out.println(user);
            UsernameWrite.close();
            part1Finish = true;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void part2() {
        Scanner scan = new Scanner(System. in );

        System.out.println("Please confirm your username: ");
        String usercheck = scan.next();
        int PassAttempts = 5;
        int UserAttempts = 5;
        user1 = user.toCharArray();
        user1 = password.toCharArray();
        char[] usernamecheck = java.util.Arrays.copyOfRange(user1, 0, user.length());
        System.out.println(usernamecheck);
        do {
            if (usercheck.equals(usernamecheck)) {
                while (PassAttempts > 0) {
                    System.out.println("Please confirm your password: ");
                    String passcheck = scan.next();
                    if (passcheck.equals(password)) {
                        System.out.println("Thank You ");
                    } else if (passcheck != password && PassAttempts > 0) {
                        PassAttempts--;
                        System.out.println("That is incorrect. Please Try Again");
                        passcheck = scan.nextLine();
                    } else {
                        System.out.println("You have run out of Password Attempts");
                        break;
                    }
                }
            } else if (usercheck != user && UserAttempts > 0) {
                UserAttempts--;
                System.out.println("That is an incorrect username. Please Try Again");
                usercheck = scan.nextLine();
            } else {
                System.out.println("You have run out of Username Attempts");
                break;
            }
        } while (UserAttempts > 0);

    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        PasswordProgram login = new PasswordProgram();
        login.part1();
        if (part1Finish == true) {
            login.part2();
        }
    }
}
我遇到的问题是方法
part2
。在这里,当我尝试将保存在变量
user
下的用户名添加到字符数组中以将其用作范围时,我得到了错误
NullPointerException

经过调查,我发现在运行
part2
时,
user
的值是
null
,因此我得到了错误

有没有办法通过
FileReader
方法来实现这一点,或者如何修复当前出现的错误?多谢各位

声明了两个用户变量,一个是静态的,具有全局作用域,另一个是part1()的本地变量。当part2()试图访问用户时,它使用的是静态声明,该声明为null。您在part1()中对user的修改是对局部变量进行的

这就是所谓的可变阴影,应该不惜一切代价避免

请参见以下示例:

class Ideone
{
    static String bla = "test1";

    public static void myMethod() {
        String bla = "test2";
        System.out.println(bla);
    }
    public static void main (String[] args) throws java.lang.Exception
    {
        myMethod();
        System.out.println(bla);
    }
}
它输出:

test2
test1

由于静态字段
user
part1
中分配了从不,因此当您尝试在
part2
中使用它时,会得到一个
NullPointerException


发布的代码中还有其他问题:

  • 目前还不清楚为什么会涉及到一份文件
  • 你使用
    =字符串的code>,
    ,例如在
    passcheck!=密码
  • usercheck.equals(usernamecheck)
  • passcheck
    被攻击但从未使用过
  • 局部变量(因为它们的名称)隐藏了一些字段
  • usernameswrite
    UserAttempts
    具有非常规名称(应为
    usernameswrite
    UserAttempts

您在哪一行获得NPE?该文件存储用户输入的用户名和密码