Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:为什么这段代码不起作用?_Java - Fatal编程技术网

Java:为什么这段代码不起作用?

Java:为什么这段代码不起作用?,java,Java,有人能告诉我这个Java代码有什么问题吗? 此数组为:静态字符串[][]数据=新字符串[6][2]但是在这种情况下,数据[0][1]=“abcd”和数据[1][1]=“efgh”,剩余的数据[2-5][1]应该是空的。我只是想打印出非空的。在(j=2,k=3)处,代码在此之后不会执行。例如,“我在这里3”没有打印出来 int k=1; System.out.println("data[2][0]="+data[2][0]); for(int j=0; j<data.length;

有人能告诉我这个Java代码有什么问题吗?
此数组为:
静态字符串[][]数据=新字符串[6][2]
但是在这种情况下,
数据[0][1]=“abcd”
数据[1][1]=“efgh”
,剩余的
数据[2-5][1]
应该是
空的。我只是想打印出非空的。在
(j=2,k=3)
处,代码在此之后不会执行。例如,“我在这里3”没有打印出来

int k=1;  
System.out.println("data[2][0]="+data[2][0]);  

for(int j=0; j<data.length; j++,k++) {
    System.out.println("j="+j+" k="+k);

    if (!(data[j][0].equals("null"))) {
        System.out.println("I am here2");
        sbissues = sbissues.append("\n");
        sbissues = sbissues.append(k);
        sbissues = sbissues.append(".  ");
        sbissues = sbissues.append(data[j][1]);
    }

    System.out.println("sbissues="+sbissues.toString());
    System.out.println("I am here1");
}
System.out.println("I am here3");
问题是我从未达到“我在这里”的境界。

感谢大家的回答,他们都是正确的(使用!=null而不是.equals)。我猜我不能投票给你们所有人,我只被允许投票一次。

我猜你们不希望它在为空时打印任何东西

将其用于if语句:

if (data[j][0] != null) {
在java中,复杂变量是对对象的引用。可以有两个变量指向同一个对象。当一个变量不指向任何东西时,它就是null。不能取消对空变量的引用,此时会出现NullPointerException


诸如int、long、byte等基本数据类型的行为不同。每次分配时,您都在复制数据。它们不能为空。

首先,您只能在一个维度中迭代(同时使用
j
k
变量)。我猜您希望迭代数据结构的两个维度(因此,对于
循环,您几乎需要两个
)。因此,我将从以下内容开始:

 for (int j=0; j<data.length; j++) {
     for (int k=0; k<data[j].length; k++) {
          // ... here goes the printing
     }
 }

for(int j=0;j像其他人一样,我不确定你的代码试图做什么。但从我所能看出,我们应该修复一些错误。也许修复这些错误会使它达到你想要的效果

首先

if (!(data[j][0].equals("null"))) {
这应该是

if (data[j][0] != null) {
第二

在if检查中,您正在检查
data[j][0]
是否为空。然后,在if块的最后一行,您正在使用
data[j][1]
。我猜这些索引应该是相同的,而不是不同的?或者您想使用
k
来索引

最后


每次迭代都在使用StringBuilder实例
方法不会刷新它的缓冲区。如果您希望输出不同的内容,请尝试在每个循环迭代结束时刷新SB实例。如果您打算附加到任何现有字符串,那么您就做对了。

您应该得到一个
NullPointerException
。您发布了所有输出吗?是吗运行程序时重定向stdout或stderr


OP评论


谢谢,这很有效!但是为什么?既然数据[j][0]是字符串类型,我不应该使用数据[j][0]。等于(null),而不是=

否,因为如果
data[j][0]
null
,尝试在其上调用
equals()
将引发
NullPointerException
。您无法访问不存在的对象的方法或字段


顺便说一下,这个
NullPointerException
应该在您的输出中是可见的。您看到类似的内容了吗?

首先,如果
str==null
,那么

str.equals("null")
生成一个
NullPointerException
。因此您可能需要更改

if (!(data[j][0].equals("null"))) {
进入


然后,给定初始化

data[2][0] = "hello";
data[2][1] = "world";
程序将打印(我删除了
“我在这里”
s):

这是因为如果列0为非空,则仅向
sbissues
追加内容


在上述分配中,您只为第1列设置了一个值,即矩阵中没有任何行会触发if语句。

上述代码的预期结果是什么?是否有任何错误?如果您得到输出,我看不到任何错误,您试图做什么?…以及
数据
是如何定义的?(或其内容是什么)是的,我看不出它有什么问题,它的行为和我预期的完全一样。这个数组是:静态字符串[][]数据=新字符串[6][2];但是在这种情况下,数据[0][1]=“abcd”和数据[1][1]=“efgh”,剩余的应该是空的。我只是试图打印出非空的。At(j=2,k=3),代码在那之后就不会执行了。起初我没有看到它,但OP在j的for循环中增加了k。我首先认为他想做你所说的,但后来我看了k的用法,似乎它们不打算成为他的数据数组的二级索引,它更像是一个基于1的计数器。虽然
k
似乎是毫无用处,数组的维数似乎为[n][2]。它看起来数组中的每个元素都是一个键值对。是的,我看到
k
总是
j+1
,但我想这不是OP的意图。我想我们永远也不会知道。谢谢,这很有效!但是为什么?既然数据[j][0]是字符串类型,我不应该使用数据[j][0]。等于(null),而不是!=
null
没有
equals()
方法。
null
不是
对象
或什么的。它根本什么都不是。任何使用句点操作符
访问/调用它的尝试都只会导致
NullPointerException
(异常名称现在对您有更合理的意义吗?)嗨,埃里克森,不,我没有在控制台上看到NullPointerException,只有我所有的打印语句。这是Eclipse上的Junit测试。@难住了-如果您在Junit窗格中单击失败的测试,您应该能够看到
NullPointerException
堆栈跟踪。(我认为;我使用TestNG,但我认为它们的UI是相似的。)
if (data[j][0] != null) {
data[2][0] = "hello";
data[2][1] = "world";
data[2][0]=hello
j=0 k=1
sbissues=
j=1 k=2
sbissues=
j=2 k=3
sbissues=
3.  world
j=3 k=4
sbissues=
3.  world        <----
j=4 k=5
sbissues=
3.  world
j=5 k=6
sbissues=
3.  world
data[0][1]="abcd"
data[1][1]="efgh"
        ^ both values put in column 1 (will not affect the data[j][0] check!)