静态属性上的 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
.
调查后我发现当 运行 part2
时 user
的值是 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
因为静态字段 user
在 part1
中 从未 分配,所以当您尝试在 part2
.
贴出的代码还有其他问题:
- 为什么会涉及到一个文件,不清楚
- 您将
!=
与 String
一起使用,例如 passcheck != password
- 您在
usercheck.equals(usernamecheck)
中的 String
和 char[]
之间使用等号
passcheck
已分配但从未使用过
- 局部变量(因为它们的名字)隐藏了一些字段
UsernameWrite
和 UserAttempts
有非常规名称(应该是 usernameWrite
和 userAttempts
我正在 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
方法来执行此操作,或者如何解决我遇到的当前错误?谢谢你。
您声明了两个 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
因为静态字段 user
在 part1
中 从未 分配,所以当您尝试在 part2
.
贴出的代码还有其他问题:
- 为什么会涉及到一个文件,不清楚
- 您将
!=
与String
一起使用,例如passcheck != password
- 您在
usercheck.equals(usernamecheck)
中的 passcheck
已分配但从未使用过- 局部变量(因为它们的名字)隐藏了一些字段
UsernameWrite
和UserAttempts
有非常规名称(应该是usernameWrite
和userAttempts
String
和 char[]
之间使用等号