在java中打印格式化的字符串/ char数组

时间:2014-06-11 01:27:46

标签: java mysql jdbc

我正在尝试从数据库格式化数据,以便所有内容彼此之间的距离相同(基本上使您的眼睛更容易)。我正陷入" ArrayIndexOutOfBoundsException"的困境。我希望得到stackoverflow这个伟大社区的帮助,以帮助我和许多其他人解决这个问题。

希望我犯了一个愚蠢的错误,并且不必完全重写。

public static String formattedString(char[] c, int len1, char[] d, int len2,
      char[] e, int len3) {
    List<Character> charlist = new ArrayList<Character>(len1);
    for (int i = 0; i < len1; i++) {
      if (c.length == len1 || c.length > len1) {
        charlist.add(c[i]);
      } else if (c.length < len2) {
        if (c.length < len1)
          charlist.add(c[i]);
        else
          charlist.add(' ');
      } else {
        charlist.add('#');
      }
    }
    List<Character> charlist2 = new ArrayList<Character>(len2);

    for (int i = 0; i < len2; i++) {
      if (d.length == len2 || d.length > len2) {
        charlist2.add(d[i]);
      } else if (d.length < len2) {
        if (d.length < len2)
          charlist2.add(d[i]);
        else
          charlist2.add(' ');
      } else {
        charlist2.add('#');
      }
    }
    List<Character> charlist3 = new ArrayList<Character>(len3);

    for (int i = 0; i < len3; i++) {
      if (e.length == len3 || e.length > len3) {
        charlist3.add(e[i]);
      } else if (e.length < len2) {
        if (i < len3)
          charlist3.add(e[i]);
        else
          charlist3.add(' ');
      } else {
        charlist3.add('#');
      }
    }

    String s = charlist.toString() + charlist2.toString()
        + charlist3.toString() + '\n';
    return s;
  }

使用formattedString函数,您可以执行以下操作

try {
  Class.forName("com.mysql.jdbc.Driver").newInstance();
  Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/table", user, password);
  Statement stmt = null;
  stmt = conn.createStatement();
  ResultSet rs = stmt.executeQuery(query);
  while (rs.next()) {
     String username = rs.getString("user_name");
     double balance = rs.getDouble("balance");
     String b = balance + "";
     int accountID = rs.getInt("account_ID");
     String id = accountID + "";
     Q.print(Q.formattedString(username.toCharArray(), 10, b.toCharArray(), 15, id.toCharArray(), 10)); 
    // This is the proper way to use the function.
   }
 } catch (SQLException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}

请注意,我的问题不是连接到DB而是使用formattedString函数 的 _______________________ UPDATE _______________________

  

线程中的异常&#34; main&#34; java.lang.ArrayIndexOutOfBoundsException:6     在co.kbcomp.java.server.usermanagement.Q.formatedString(Q.java:58)     在co.kbcomp.utils.Command.getAllUsers(Command.java:211)     在co.kbcomp.utils.Command.execute(Command.java:28)     在co.kbcomp.java.server.Main。(Main.java:27)     在co.kbcomp.java.server.StartServer.main(StartServer.java:5)

3 个答案:

答案 0 :(得分:1)

我建议你这样做:

Q.formattedString(username.toCharArray(), username.length(), b.toCharArray(), b.length(), id.toCharArray(), id.length())

当每个字符串变量可能包含长度小于您定义的最大长度的字符串时,可能会发生错误。
(10,15和10 - 分别为usernamebid

因此,最好测量每个变量的长度并将其用作参数..

<强>更新

我明白了,所以你想要长度一致的字符串..

也许你只是错误输入了一些变量名..

public static String formattedString(char[] c, int len1, char[] d, int len2,
      char[] e, int len3) {
    List<Character> charlist = new ArrayList<Character>(len1);
    for (int i = 0; i < len1; i++) {
      if (c.length == len1 || c.length > len1) {
        charlist.add(c[i]);
      } else if (c.length < len1) { //<--here
        if (c.length < len1)
          charlist.add(c[i]);
        else
          charlist.add(' ');
      } else {
        charlist.add('#');
      }
    }
    List<Character> charlist2 = new ArrayList<Character>(len2);

    for (int i = 0; i < len2; i++) {
      if (d.length == len2 || d.length > len2) {
        charlist2.add(d[i]);
      } else if (d.length < len2) {
        if (d.length < len2)
          charlist2.add(d[i]);
        else
          charlist2.add(' ');
      } else {
        charlist2.add('#');
      }
    }
    List<Character> charlist3 = new ArrayList<Character>(len3);

    for (int i = 0; i < len3; i++) {
      if (e.length == len3 || e.length > len3) {
        charlist3.add(e[i]);
      } else if (e.length < len3) { //<--here
        if (i < len3)
          charlist3.add(e[i]);
        else
          charlist3.add(' ');
      } else {
        charlist3.add('#');
      }
    }

    String s = charlist.toString() + charlist2.toString()
        + charlist3.toString() + '\n';
    return s;
  }

答案 1 :(得分:0)

可能发生ArrayIndesOutOfBoundsException的唯一原因是因为username.toCharArray(),b.toCharArray()和id.toCharArray()的长度分别超过10,15和10。

在formattedString函数中,您可以使用c [i],d [i]和e [i]访问这些数组,其中i应分别介于0到10,15,10之间。

建议删除这种情况是打印username.toCharArray(),b.toCharArray()和id.charArray()的长度,然后确保何时将它传递给它保持在for的范围内的函数循环变量。

答案 2 :(得分:0)

我只是想让大家知道我的解决方案,如下所示。

public static String formattedString(char[] c, int len1, char[] d, int len2, char[] e, int len3) {
    char[] charlist = new char[len1];
    for (int i = 0; i < len1; i++) {
      if (c.length == len1 || c.length > len1) {
        charlist[i] = (c[i]);
      } else if (c.length < len1) { // <--here
        if (c.length > i)
          charlist[i] = (c[i]);
        else
          charlist[i] = ' ';
      } else {
        charlist[i] = '#';
      }
    }
    char[] charlist2 = new char[len2];

    for (int i = 0; i < len2; i++) {
      if (d.length == len2 || d.length > len2) {
        charlist2[i] = (d[i]);
      } else if (d.length < len2) {
        if (d.length > i)
          charlist2[i] = (d[i]);
        else
          charlist2[i] = ' ';
      } else {
        charlist2[i] = '#';
      }
    }
    char[] charlist3 = new char[len3];

    for (int i = 0; i < len3; i++) {
      if (e.length == len3 || e.length > len3) {
        charlist3[i] = (e[i]);
      } else if (e.length > i) { // <--here
        if (i < len3)
          charlist3[i] = (e[i]);
        else
          charlist3[i] = ' ';
      } else {
        charlist3[i] = '#';
      }
    }
    String s ="";
    int i = 0;
    for(char a : charlist){
      s += a;
    }
    for(char a : charlist2){
      s += a;
    }
    for(char a : charlist3){
      s += a;
    }

    return s+'\n';
  }