我的代码For循环出错?

时间:2014-02-10 07:04:07

标签: java servlets for-loop

我试图将没有空格的句子分成3个单词组。以下是句子。

MyNamePanBokVa

以下是我的代码

public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
    {
        //String[] listOfWords = request.getParameter("wordList").trim().split("\n");
        //int percentage = Integer.parseInt(request.getParameter("percentage"));

        PrintWriter pw = response.getWriter();

        int numberOfKnownWords = 0;

        //Read the Hash File
        String str = "";
        File inputFile = new File("C:/Users/xxx/Desktop/Test.txt");
        HashSet<String>set = new HashSet<String>();
        BufferedReader br = new BufferedReader(new FileReader(inputFile));

        while((str=br.readLine())!=null)
        {
            int lastIndex = 0;

            for(int i=0;i<=str.length();i=i+3)
            {
                try
                {
                    String stringPiece = str.substring(i, i+3);
                    lastIndex = i;
                    pw.println(stringPiece);
                }
                catch(Exception arr)
                {
                    String stringPiece = str.substring(lastIndex, str.length());
                    pw.println(stringPiece);
                }
            }
        }

    }

不幸的是,这会产生以下输出。

MyN
ame
Pan
Bok
BokVa

这应该是,

MyN
ame
Pan
Bok
Bok
Va

我想我的for循环中有一个错误,但我无法发现它。这有什么不对?

6 个答案:

答案 0 :(得分:3)

考虑i处于V的情况。

MyNamePanBokVa
            ^

i = 12 到目前为止的输出:

MyN
ame
Pan
Bok


   {
     String stringPiece = str.substring(i, i+3); 
    //throws exception, lastindex is not updated
     lastIndex = i;
    }
    catch(Exception arr)
                    {       
                        String stringPiece = str.substring(lastIndex, str.length());
                        // lastIndex =9 prints BokVa
                        pw.println(stringPiece);
                    }

答案 1 :(得分:2)

您需要在获取stringPiece之前输入lastIndex。在上面的代码中,当你尝试获取stringPiece时,将生成异常并且lastindex将变为9,因此最后一个被删除的字符串是错误的。

按以下方式制作你的for循环。

for(int i=0;i<=str.length();i=i+3)
{
   try
   {
        lastIndex = i;
        String stringPiece = str.substring(i, i+3);
        pw.println(stringPiece);
   }
   catch(Exception arr){
       String stringPiece = str.substring(lastIndex, str.length());
       pw.println(stringPiece);
   }
}

答案 2 :(得分:1)

作业应

 lastIndex = i+3;

因为如果lastIndex抛出str.substring(i, i+3);

,则不会设置Exception

答案 3 :(得分:1)

可以做得更简单:

    while((str=br.readLine())!=null)
    {
        String [] pieces = str.split("(...)/g");
        for(int i=0;i<=pieces.length();i++)
        {
           pw.println(pieces[i]);
        }
     }

答案 4 :(得分:0)

它不在你的循环中。这就是你如何检测到你必须打印最后一部分。

try {
    String stringPiece = str.substring(i, i+3);
    lastIndex = i;

str.substring抛出异常,因为i+3在最后一次迭代中超出范围。 try块将立即保留,并在catch中继续执行。但是你还没有修改lastIndexcatch块会在当前之前打印一次迭代值。

要解决您的问题,请在try块中交换订单

try {
    lastIndex = i;
    String stringPiece = str.substring(i, i+3);

答案 5 :(得分:0)

当i = 12时,“str.substring(i,i + 3)”将抛出异常。因为长度是14. 12 + 3是15. lastIndex现在是最后一次的9. in catch,“String stringPiece = str.substring(lastIndex,str.length());”等于“String stringPiece = str.substring(9,14);”现在,你最终得到了BokVa。