静态属性上的 NullPointerException

NullPointerException on a static attribute

我正在 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.

调查后我发现当 运行 part2user 的值是 null 因此我得到了错误。

有没有一种方法可以通过 FileReader 方法来执行此操作,或者如何解决我遇到的当前错误?谢谢你。

您声明了两个 user 变量,一个是静态的并且具有全局范围,另一个是 part1() 的局部变量。当 part2() 试图访问 user 时,它使用的是静态声明,该声明为 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

因为静态字段 userpart1 从未 分配,所以当您尝试在 part2.


贴出的代码还有其他问题:

  • 为什么会涉及到一个文件,不清楚
  • 您将 !=String 一起使用,例如 passcheck != password
  • 您在 usercheck.equals(usernamecheck)
  • 中的 Stringchar[] 之间使用等号
  • passcheck 已分配但从未使用过
  • 局部变量(因为它们的名字)隐藏了一些字段
  • UsernameWriteUserAttempts 有非常规名称(应该是 usernameWriteuserAttempts