Java 静态属性上的NullPointerException
我正在用java创建一个简单的登录程序。这是我到目前为止的代码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
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