2014-02-24 207 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;