2017-09-12 10 views
1

テーブルを作成するための文字列を作成するプログラムがありますが、「ループを離れる」必要があるまで(allClearをtrueにする必要があるまで)は問題ありません。リストのエラー<String> Javaの場合

文字列retを印刷しようとしましたが、常に "| |"のような文字列があります。それ以降、リストlにはすべてのStringが ""に設定されています。その場合、メソッドallClearはtrueを返す必要があります。

これは、テーブルの列を作成するメソッドのコードで、すべての文字列とそのテーブルの持つ列数を取得し、すべてのテーブル文字列を含むStringを返します。これはallClear方法である

public static String buildNCol(List<String> l, int n)throws NotEnoughStringsException{ 
    if(l.size()<n)throw new NotEnoughStringsException("Not enough Strings given"); 
    int colSize = colSize(n); 
    int colN,curChar,curSize; 
    String ret="",temp=""; 
    boolean check = true; 
    while(check){ 
     ret=""; 
     for(colN=0;colN<n;colN++){ 
      temp = getLine(l,colN,colSize); 
      for(curSize=temp.length();curSize<colSize;curSize++)temp+=' '; 
      if(colN!=n-1)temp+=" | "; 
      ret+=temp; 
     } 
     ret+='\n'; 
     for(colN=0;colN<n;colN++)l.set(colN,cutString(l.get(colN))); 
     if(allClear(l,n))check=true; //This is where the error happens 
    } 
    return ret; 
} 

、 "コル3 |コル2 |コル3 \のNcoI 1 | |コル2コル1":

それはのような文字列を返す必要があります。このメソッドは、リスト内の最初のn個の文字列がすべて ""、ヌルまたは "\ n"に設定されているかどうかをチェックします。

private static boolean allClear(List<String> l,int n){ 
    int i; 
    String temp; 
    for(i=0;i<n;i++){ 
     temp = l.get(i); 
     if(temp!=null&&temp.length()>1) return false; 
     if(temp.length()==1&&temp.charAt(0)!='\n')return false; 
    } 
    return true; 
} 
+1

'check'は最初は' true'に設定され、 'allClear'が' true'を返すとき条件付きで 'true'に設定されます。 'while'ループの中に' check'を 'false'に設定したり、' break'を発行するものはありませんので、**永遠にループします**。 –

+0

今は[小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を理解するのに良い時期のようです。 – Dukeling

+1

@KevinAnderson私はそれがエラーであるとは信じられません、あなたは私に多くの時間をここに保存しました、ありがとうございました – Ash

答えて

1

としてはallClearがtrueを返した場合、条件がtrueに設定され、 チェックが最初にtrueに設定され、ケビン・アンダーソンのコメントで述べています。 whileループ内の何もチェックをfalseに設定したり、ブレークを発行したりすることはないので、永遠にループします。

あなたはそうのようにfalseにチェックを設定することで、この問題を解決することができます

check = false; 
+1

そこに戻る方法は問題ではありません。このメソッドは "**すべて**クリア"と呼ばれます。* 1つがクリアされていない場合、falseを返す必要があります。残りは問題ではなく、すぐに戻ることができます。ベストプラクティスはさておき... – Dukeling

+0

クール、私は私の答えを編集します。 –

0

@KevinAndersonコメントで言ったように、プログラムのエラーが、私はそれが "にコード化されたので、チェックは、falseになることはありませんということでした偽の代わりにtrueに変更します。

関連する問題