1

我创建了一个程序,允许用户输入日记条目(最多 7 天),然后允许人们在输入条目后调用其中一天。不幸的是,这给我留下了一些我不熟悉的奇怪的字符串错误。

代码如下:

public class eDiary{
public static void main (String args[]){
    int[] days = new int[7];//get our days
    days[0] = 1;//start with 1 and not 0
    days[1] = 2;
    days[2] = 3;
    days[3] = 4;
    days[4] = 5;
    days[5] = 6;
    days[6] = 7;
    String [] events = new String[7];//events for the days
    int i = 0;

    //asks for input and counts
   for(i=0; i<7; i++){
    String event = Console.readString("Tell me the major event of day " + days[i] + "\n");
    events[i] = event; 

}

 int journal_entry = Console.readInt("Enter what day you want to hear or Enter 0 to stop \n");
 while (journal_entry != 0) { 
     System.out.println(events);
     journal_entry = Console.readInt("Enter what day you want to hear or Enter 0 to stop \n");   
    //get r dun!

输入和输出:

Tell me the major event of day 1
one
Tell me the major event of day 2
two
Tell me the major event of day 3
thre
Tell me the major event of day 4
four
Tell me the major event of day 5
five
Tell me the major event of day 6
six
Tell me the major event of day 7
seven
Enter what day you want to hear or Enter 0 to stop 
1
[Ljava.lang.String;@10181f5b
Enter what day you want to hear or Enter 0 to stop 
0

大家好!

非常感谢您的快速回复。它现在似乎正在做的一件事是更换时

System.out.println(events);

System.out.println(events[journal_entry]);

现在给我这样的输入:

Tell me the major event of day 1 
first day
Tell me the major event of day 2
second day
Tell me the major event of day 3
third day
Tell me the major event of day 4
fourth day
Tell me the major event of day 5
fifth day
Tell me the major event of day 6
sixth day
Tell me the major event of day 7
seventh day
Enter what day you want to hear or Enter 0 to stop 
1//the day im asking for
second day//spitting out the next day's entry instead of the first day's entry
Enter what day you want to hear or Enter 0 to stop 
0//this is me stopping it
4

8 回答 8

10

这不是错误。

System.out.println(events);

在这一行中,您尝试打印数组,该语句不打印数组内容,它只打印对象类名及其哈希码。

要打印您必须使用的数组内容

System.out.println(Arrays.toString(events));

或者,如果需要,循环遍历数组并打印其值

于 2013-10-20T13:26:48.920 回答
4

当你显式或隐式调用并且目标对象的类没有覆盖时,这些[Ljava.lang.String;@10181f5b东西就是你得到的。在这种情况下,问题在于 Java 数组类型不会覆盖.Object.toString()toString()toString()

如果要输出数组,请使用java.util.Arrays.toString(...)将其转换为字符串,然后输出。

但在这种情况下,您实际上需要输出一个特定的条目,而不是整个数组。解决方法是改变

    System.out.println(events);

    System.out.println(events[journal_entry]);

作为记录,上面的内容由类内部名称(“[Ljava.lang.String;”)和对象的标识哈希码(十六进制)组成。

这不是一个“奇怪的错误字符串”。

于 2013-10-20T13:27:40.063 回答
2

您得到的输出是因为:

在Java中,每个对象都有toString()方法,默认是显示类名表示,然后添加@,然后是哈希码。

你应该使用Arrays#toString(),它是这样实现的:

3860     public static String toString(int[] a) { {
3861        if (a == null)
3862            return "null";
3863        int iMax = a.length - 1;
3864        if (iMax == -1)
3865            return "[]";
3866
3867        StringBuilder b = new StringBuilder();
3868        b.append('[');
3869        for (int i = 0; ; i++) {
3870            b.append(a[i]);
3871            if (i == iMax)
3872                return b.append(']').toString();
3873            b.append(", ");
3874        }
3875    }

这将帮助您更好地理解数组。

当然,您可以手动循环数组并打印它:

for(String event: events) {
    System.out.println(event);
}
于 2013-10-20T13:29:13.163 回答
0

It won't print out the answer correctly because you just pointed System.out.println() to events which is supposed to be an array pointer and not the actual variable. You should just replace this line with

System.out.println(events[journal_entry]);

For it to make sense. Run it with the conmmand and see if it will run properly.

于 2013-10-20T13:44:31.353 回答
0

没有错,这不是错误消息。

相反,它是数组的字符串表示形式。考虑这一行:

System.out.println(events);

你正在打印整个数组,所以你得到了那个表示——这确实有点难看。您只想打印一个元素,即与所选日期相对应的元素。利用:

System.out.println(events[journal_entry]);

并执行绑定检查。

于 2013-10-20T13:27:13.357 回答
0

这不是错误。您想打印变量events的值。[Ljava.lang.String;@10181f5b表示 events 是java.lang.String类型的数组,而10181f5b是此变量的哈希码。您要打印的是 event[i] 其中 i 是一天的数量。

于 2013-10-20T13:28:26.763 回答
0

在 java 中,数组被视为对象。您正在打印不是您想要的事件数组对象。

您需要在一周中打印一天的名称。你需要更换

 System.out.println(events);

 System.out.println(events[journal_entry]);
于 2013-10-20T13:31:56.783 回答
0

感谢所有的回复!我能够解决这个问题。如果有人好奇,这是代码:

public static void main (String args[]){
int[] days = new int[7];//get our days
days[0] = 1;//start with 1 and not 0
days[1] = 2;
days[2] = 3;
days[3] = 4;
days[4] = 5;
days[5] = 6;
days[6] = 7;
String [] events = new String[7];//events for the days
int i = 0;

//asks for input and counts


for(i=0; i<7; i++){
String event = Console.readString("Tell me the major event of day " + days[i] + "\n");
events[i] = event; 

int journal_entry = Console.readInt("输入您想听的日期或输入 0 停止\n"); while (journal_entry != 0) { System.out.println("当天 " + days[i = 0] + " " + events[journal_entry - 1]); journal_entry = Console.readInt("输入您想听的日期或输入 0 停止\n");

于 2013-10-21T04:22:37.947 回答