有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Break语句不起作用

这是我代码的一小部分。这里的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

异常是因为调用“clustersRefLocal()”函数时使用了空的“assign”参数。如果有人知道问题出在哪里,或者我遗漏了什么

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;
}

这是代码所在的函数


共 (3) 个答案

  1. # 1 楼答案

    我建议你简单地颠倒逻辑:

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

    但如果做不到这一点,请检查变量i发生了什么:

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

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

  2. # 2 楼答案

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

    如果在带标签的while语句之前添加一个traceprint,这一点就很明显了


    The exception is because the "clustersRefLocal()" function is called with empty "assign" parameter.

    我怀疑你把“空”和null混淆了。空字符串是长度为零的非空String。如果您试图通过调用String.isEmpty()来测试null字符串是否为空,您将得到一个NPE。对非空字符串的正确测试如下:

    if (assign == null || assign.isEmpty()) {
        // null or empty ... bail out
        break;
    }
    
  3. # 3 楼答案

    不鼓励标记循环和使用break label。(就像goto一样,会产生意大利面代码。)

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