在单独打印嵌套数组的元素时遇到问题。下面的代码打印主数组的每个元素,但是当我尝试让子数组元素单独打印时,我会收到:
凭证[0] [1]:null
请帮帮我。以下是代码:
package authentication;
import java.io.File;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.util.List;
import java.util.Scanner;
public class Authentication {
public static void main(String[] args) throws Exception {
Scanner scnr = new Scanner(new File("C:\\Users\\**masked**\\NetBeansProjects\\authentication\\credentials.txt"));
String credentials[][] = new String[6][4];
String person[] = new String[4];
int i = 0;
String userName = "";
String passWord = "";
Scanner inSS = null;
//read credentials file
while (scnr.hasNextLine()) {
credentials[i][0] = scnr.nextLine();
++i;
}
//get user inputs
scnr = new Scanner(System.in);
boolean run = true;
int x = 0;
while (run) {
System.out.println("**Welcome**");
System.out.println("1) Login");
System.out.println("2) Exit");
int y = Integer.parseInt(scnr.nextLine().trim());
//iterate attempts
if (y == 2) {
System.out.println("Exitting, Good-bye.");
}
if (y == 1) {
++x;
//get username and password
System.out.println("\nEnter username: ");
userName = scnr.nextLine();
//generate hash
MessageDigest md;
md = MessageDigest.getInstance("MD5");
md.update(passWord.getBytes());
byte[] digest = md.digest();
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b & 0xff));
}
String hPassword = sb.toString();
}
else {
run = false;
break;
}
//notification
if (x == 3) {
run =false;
System.out.println("Attempts exceeded");
}
System.out.println("\n" + "credentials[0]: " + credentials[0][0]);
System.out.println("credentials[1]: " + credentials[1][0]);
System.out.println("credentials[2]: " + credentials[2][0]);
System.out.println("credentials[3]: " + credentials[3][0]);
System.out.println("credentials[4]: " + credentials[4][0]);
System.out.println("credentials[5]: " + credentials[5][0] + "\n");
System.out.println("credentials [0][0]: " + credentials[0][0]);
System.out.println("credentials [0][1]: " + credentials[0][1]);//this is where I need the assistance
}
}
}
//End of code
结果目前看起来像这样:
** **欢迎
1)登录
2)退出
1
输入用户名:
bruce.grizzlybear
凭证[0]: griffin.keyes 108de81c31bf9c622f76876b74e9285f"字母表 汤"动物园管理员
凭证[1]: rosario.dawson 3e34baa4ee2ff767af8c120a496742b5"动物医生"管理员
凭证[2]: bernie.gorilla a584efafa8f9ea7fe5cf18442f32b07b"秘密 密码"兽医
凭证[3]:donald.monkey 17b1b7d8a706696ed220bc414f729ad3" M0nk3y 业务"动物园管理员
凭证[4]: jerome.grizzlybear 3adea92111e6307f8f2aae4721e77900" grizzly1234"兽医
凭证[5]: bruce.grizzlybear 0d107d09f5bbe40cade3de5c71e9e9b7" letmein"管理员
凭证[0] [0]: griffin.keyes 108de81c31bf9c622f76876b74e9285f"字母表 汤"动物园管理员
凭证[0] [1]:null
答案 0 :(得分:0)
您当前正在将字符串而非数组存储到凭据中,并且所有内容都存储在第i个元素的第0个元素中:
改变这个:
while (scnr.hasNextLine()) {
credentials[i][0] = scnr.nextLine();
++i;
}
为:
while (scnr.hasNextLine()) {
credentials[i] = scnr.nextLine().split(" ");
++i;
}
你可能会得到你想要的效果。
答案 1 :(得分:0)
欢迎来到SO。在你的代码中,我只看到数组只在一个地方填充:
while (scnr.hasNextLine()) {
credentials[i][0] = scnr.nextLine();
++i;
}
现在考虑一下你的阵列的下图:
如果上面的代码贯穿new String[6][4]
,您的i = 0 to 5
看起来就像上面的内容。如果您仔细查看上面的内容,则只填充每个主要块的第一个索引,即0
,这也显示在我添加的图像中。因此,当您尝试访问0
以外的辅助索引时,您将获得null
,因为创建数组时默认值为String
。
简而言之,您从未填充credentials[0][1]
或实际上填充图像中所示的任何灰色块。