繁体   English   中英

中断声明不起作用

[英]Break statement doesn't work

这只是我代码的一小部分。 在这里,break语句不起作用。 如果执行了if条件,但break语句将控制权移至while循环的开始。 “ assign”和“ clsAssign”是两个数组列表。 “ clustersRefGlobal()”是一个函数,当它为空时,我不想传递“赋值”。 但是,由于中断而无法正常工作,即使“ assign”为空,也会被调用。 我不确定为什么break语句不会停止while循环

   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

例外是因为使用空的“ assign”参数调用了“ 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;
}

这是存在代码的功能

对您所看到的内容的简单解释是,实际上break使循环停止了……但是您向我们展示的代码片段周围的代码又重新开始了。

如果在标记的while语句之前添加跟踪记录,这将很明显。


例外是因为使用空的“ assign”参数调用了“ clustersRefLocal()”函数。

我怀疑您将“ empty”与null混淆了。 空字符串是长度为零的非空String 如果尝试通过调用String.isEmpty()测试null字符串是否为空,则会得到一个NPE。 对于非null,非空String的正确测试是:

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

我建议您简单地反转逻辑:

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

但是如果失败,请检查变量i发生了什么:

您的支票用于: while (i < n)

但是i唯一改变过的地方就增加了。

不建议给循环加break label并使用break label (它类似于goto并导致意大利面条代码。)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM