2014-02-24 162 views
0

这是我的代码的一小部分。这里break语句不起作用。 if条件被执行,但break语句将控制权交给while循环的开始。 “分配”和“clsAssign”是两个数组列表。 “clustersRefGlobal()”是一个函数,我不想在它为空时传递“assign”。但由于中断不工作,即使在“分配”为空时也会调用它。我不知道为什么break语句不会停止while循环Break语句不起作用

Wh:while (i < n) { 
     System.out.println("Start"); 
     get = clustersRefGlobal(assign); 
     clsAssign.add(get.get(0)); 
     assign = get.get(1); 
     if(assign.isEmpty()){ 
      System.out.println("Inside"); 
      break Wh; 
     } 
     System.out.println("End"); 
     i++; 
    } 

这里是输出

Start 

End 

Start 

Inside 

Start 

Exception in thread "main" java.lang.NullPointerException 
    at softwareClustering.DominantSetClustering.clustersRefGlobal(DominantSetClustering.java:54) 
    at softwareClustering.DominantSetClustering.buildDominatSetClustering(DominantSetClustering.java:76) 
    at trees.PrototypeSelectionTree.clustersRefLocal(PrototypeSelectionTree.java:214) 
    at trees.PrototypeSelectionTree.clustersRefGlobal(PrototypeSelectionTree.java:180) 
    at trees.PrototypeSelectionTree.buildTree(PrototypeSelectionTree.java:59) 
    at trees.PrototypeSelectionTree.buildClassifier(PrototypeSelectionTree.java:235) 
    at weka.classifiers.Evaluation.crossValidateModel(Evaluation.java:617) 
    at trees.TestClassifier.main(TestClassifier.java:45) 
Java Result: 1 

唯一的例外是因为“clustersRefLocal()”函数调用空“分配”参数。如果有人知道这个问题或我错过了什么?

public double[] buildDominatSetClustering(int n) throws Exception { 
    int i = 1; 
    ArrayList<ArrayList<Integer>> clsAssign = new ArrayList<>(); 
    ArrayList<Integer> assign = new ArrayList<>(); 
    ArrayList<ArrayList<Integer>> get; 
    for (int j = 0; j < data.numInstances(); j++) { 
     assign.add(j); 
    } 
    Wh: 
    while (i < n) { 
     System.out.println("hello"); 
     get = clustersRefGlobal(assign); 
     clsAssign.add(get.get(0)); 
     assign = get.get(1); 
     if(assign.isEmpty()){ 
      System.out.println("inside "+assign.size()); 
      break Wh; 
     } 
     System.out.println(assign.size()); 
     i++; 
    } 
    if(!assign.isEmpty()) 
    clsAssign.add(assign); 
    double[] indexAssToClus = new double[data.numInstances()]; 
    int count = 0; 
    for (ArrayList<Integer> a : clsAssign) { 
     for (int k = 0; k < a.size(); k++) { 
      indexAssToClus[a.get(k)] = count; 
     } 
     count++; 
    } 
return indexAssToClus; 
} 

这是其中的代码存在

+1

这是我见过的最奇怪的语法 – Brian

+0

我们在谈论Java吗? – Dropout

+3

它适用于我类似的代码。也许你正在调用这个方法两次?请显示一个简短的*完整的*程序来证明问题。 (一般来说,只需放下标签即可。标记为Java的语句非常罕见。) –

回答

0

的功能,我建议你只需反向逻辑:

if(! assign.isEmpty()){ 
    i++; 
} 

但是做不到这一点,检查什么是发生在你的变量i

您的支票是:while (i < n)

但唯一的地方是i有变,它是递增的。

+0

这将不会退出循环。 –

+0

循环不会退出。但是,逻辑越简单,越容易看到:) – Stewart

+0

是的,它永远不会退出循环 – user3212493

1

对你所看到的简单解释是,实际上break正在停止循环......但是你向我们展示过的代码片段中的代码正在重新开始。

如果您在标记为while的语句之前立即添加一个跟踪打印,这将很明显。


唯一的例外是因为 “clustersRefLocal()” 函数调用空 “分配” 参数。

我怀疑你对null的“空”感到困惑。一个空字符串是一个长度为零的非空String。如果您尝试通过拨打String.isEmpty()来测试null字符串是否为空,您将得到一个NPE。对于一个非空,非空字符串正确的测试是这样的:

if (assign == null || assign.isEmpty()) { 
    // null or empty ... bail out 
    break; 
} 
+0

那么,我明白这个问题,而不是它是否为空或空。如果条件对于assign.isEmpty()是真的,那么为什么需要控制开始while循环并调用函数“clustersRefLocal()”。我在这个功能上做的是一个单独的故事。重点是,如果条件为真,循环应该被终止 – user3212493

+0

>>我的<<点是,这不是发生了什么。循环>>是“终止,并以某种方式重新开始。如果你不相信我,那么证明我是错的......通过编写和发布一个SSCCE,让我们可以亲眼看看发生了什么。 –

0

做上标记,循环和使用break label气馁。 (它像goto并导致意大利面代码。)

此外,这里没有意义,因为你没有嵌套循环。您可以将break Wh;更改为break;