在java

时间:2018-04-05 19:36:55

标签: java arrays multidimensional-array

在单独打印嵌套数组的元素时遇到问题。下面的代码打印主数组的每个元素,但是当我尝试让子数组元素单独打印时,我会收到:

  

凭证[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

2 个答案:

答案 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;
}

现在考虑一下你的阵列的下图:

credentials array

如果上面的代码贯穿new String[6][4],您的i = 0 to 5看起来就像上面的内容。如果您仔细查看上面的内容,则只填充每个主要块的第一个索引,即0,这也显示在我添加的图像中。因此,当您尝试访问0以外的辅助索引时,您将获得null,因为创建数组时默认值为String

简而言之,您从未填充credentials[0][1]或实际上填充图像中所示的任何灰色块。