我已经分配了一个项目,我必须在java中创建一个登录系统,使用filein将帐户写入数组,并通过确认输入用户名使用该数组登录数组中的用户名。我的用户名和密码位于正在读取的.txt文件的同一行,所以我试图将字符串从字符串的开头拉到第一个空格,这样就产生了这个用户输入位于:
编辑:当试图孤立时,我以某种方式解决了它。重新添加infile和array时,会再次导致错误。编辑:我已经添加了一个accountCounter,因此它只会循环多次,因为数组值不为空。不幸的是,我仍然遇到了错误。
java.lang.NullPointerException
at zamp.main(zamp.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
在尝试抓取子字符串(打印它,将其委托给单独的字符串)的所有实例中,都会产生这种情况。
这是我的代码!
import java.io.*;
import java.util.Scanner;
//import java.net.*; //handles the network protocols
public class zamp {
public static void main(String[] args) throws IOException {
Scanner yiff = new Scanner(System.in);
BufferedReader infile = new BufferedReader (new FileReader("passwords.txt"));
String searchuser;
int f;
int i;
int accountnumber=0;
String modernPass="i";
String[] accounts = new String[5];
String searchpass;
String line = infile.readLine();
for(i=1; i<11; i++){
if (line!=null) {
accounts[i]=line;
System.out.println(""+accounts[i]);
line=infile.readLine();
accountnumber++;
}
}
System.out.println("Enter your username.");
searchuser=yiff.nextLine();
for (f=0; f<(accountnumber); f++) {
modernPass=(""+(accounts[f].substring(0, ((accounts[f].indexOf(" "))))));
if (searchuser.equals(modernPass)) {
System.out.println("Enter your password.");
searchpass=yiff.nextLine();
}
else {
}
}
}}
passwords.txt
已
user1 password1
user2 password2
我确定解决方案非常简单!
再次感谢您的帮助,真诚地,一名学生在3个小时内完成截止日期。
答案 0 :(得分:3)
你已经摆脱了阵列界限。
尝试重写
for (f=0; f<=(accounts.length); f++)
作为
for (f=0; f<(accounts.length); f++)
答案 1 :(得分:0)
modernPass=(""+(accounts[f].substring(0, ((accounts[f].indexOf(" "))))));
堆栈跟踪表示您在index out of range
中获得substring
,并且其中一个参数为-1。 indexOf
的{{3}}表示,
如果此字符串中没有出现此类字符,则返回-1。
答案 2 :(得分:0)
(关闭你最近的编辑)
你几乎就在那里。唯一的一点是,当你从文件填充数组时,从索引1开始插入。这使索引0 null
。
这会导致问题,因为当您开始处理数据时,您从索引0开始 - 保证NullPointerException
。
从索引0开始读取数据,或使用空检查(即if (_____ != null)
)来避免此问题。
将来,调查ArrayList
和其他可调整大小的List
s会让您的生活变得更加轻松。或者,如果您愿意两次读取文件,则可以一次读取该文件以确定其中有多少项,创建具有该大小的数组,然后读取数据中的实际数据。
此外,数据中的第一个for
循环读数可能更好地写为while
循环:
while (inFile.hasNextLine()) {
// read in data
}
最后,我还建议学习使用调试器。它是一个非常有价值的工具,用于在程序运行时检查程序,以了解程序的执行情况。