拉出子字符串会导致Nullpointer

时间:2014-06-20 00:08:49

标签: java string substring

我已经分配了一个项目,我必须在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个小时内完成截止日期。

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 和其他可调整大小的Lists会让您的生活变得更加轻松。或者,如果您愿意两次读取文件,则可以一次读取该文件以确定其中有多少项,创建具有该大小的数组,然后读取数据中的实际数据。

此外,数据中的第一个for循环读数可能更好地写为while循环:

while (inFile.hasNextLine()) {
    // read in data
}

最后,我还建议学习使用调试器。它是一个非常有价值的工具,用于在程序运行时检查程序,以了解程序的执行情况。