2013-06-24 3 views
1

Я работаю с Apache POI и используя мой этот код:не смог выйти Петлю

private void remove() { 
    HSSFWorkbook wb = null; 
    HSSFSheet sheet = null; 
    try { 
     FileInputStream is = new FileInputStream("C:/juni.xls"); 
     wb = new HSSFWorkbook(is); 
     sheet = wb.getSheetAt(0); 
     for (Row row : sheet) { 
      for (Cell cell : row) { 
       if (cell.getCellType() == Cell.CELL_TYPE_STRING) { 
        if (cell.getRichStringCellValue().getString().trim().contains("POST")) { 
         row_count_post_1 = row.getRowNum(); 
         DashBoard.txt.setText("Processed the STRING \"POST\" on Row#" + row_count_post_1); 
         HSSFRow removingRow = sheet.getRow(row_count_post_1); 
         if (removingRow != null) { 
          sheet.removeRow(removingRow); 
         } 
         int lastIndex = sheet.getLastRowNum(); 
         sheet.shiftRows(row_count_post_1 + 1, lastIndex, -1); 
        } else { 
         break; 
        }////////////want to break from here; 
       } 
      } 
     } 
    } catch (Exception e) { 
     //do catch for no exception 
    } 
} 

Проблема заключается в том, что я хочу, чтобы выйти из цикла, когда мой if оператор перестает работать. Все работает нормально, если я не использую свой else. На самом деле, если этому коду не удается найти строку, она должна остановиться, но в моем случае else внезапно работает с моей if и только одной итерацией в этом случае. Пожалуйста, скажите мне, что я делаю неправильно, мне просто нужны подсказки, а не общая помощь. Заранее спасибо

+2

«* Проблема заключается в том, что я хочу, чтобы выйти из цикла, когда мой„если“заявление перестает работать *!» - Как Операторы 'if' перестают работать? Я не понимаю, что вы имеете в виду. И, пожалуйста, отложите свой код, чтобы нам (и вам) было легче помочь вам. – Maroun

+0

Мне просто нужно выбраться из моей петли, когда мой контроль приходит в другое утверждение! это просто, но мой код не работает! – user2496503

+0

после reindent, возможно, вам нужно другое другое для первого, если: 'if (cell.getCellType() == Cell.CELL_TYPE_STRING) {'. BTW, разрыв будет только нарушать внутренний цикл, а не внешний цикл. вам нужно будет пометить первый цикл, если вы хотите вырваться из этого – TecHunter

ответ

2

Вы вопрос неясен, но исследовать, что:

private void remove(){ 
    HSSFWorkbook wb = null; 
    HSSFSheet sheet=null; 

    try { 

     FileInputStream is = new FileInputStream("C:/juni.xls"); 

     wb = new HSSFWorkbook(is); 
     sheet = wb.getSheetAt(0); 
     //Tagging the loops 
     OuterLoop : for (Row row: sheet) { 
      InnerLoop : for (Cell cell: row) { 

       if (cell.getCellType() == Cell.CELL_TYPE_STRING) { 

        if (cell.getRichStringCellValue().getString().trim().contains("POST")) { 

         row_count_post_1 = row.getRowNum(); 

         DashBoard.txt.setText("Processed the STRING \"POST\" on Row#" + row_count_post_1); 
         HSSFRow removingRow = sheet.getRow(row_count_post_1); 

         if (removingRow != null) { 
          sheet.removeRow(removingRow); 
         } 
         int lastIndex = sheet.getLastRowNum(); 
         sheet.shiftRows(row_count_post_1 + 1, lastIndex, -1); 
        } else { 
         break InnerLoop; // OR break OuterLoop; 
        } ////////////want to break from here; 
       } 
      } 
     } 
    } catch (Exception e) { 
     //do catch for no exception 
    } 
} 
+0

Приятно, но я бы добавил, что не рекомендуется использовать оператор 'break' в цикле' for', было бы лучше использовать 'while 'loop вместо – BackSlash

+0

@BackSlash true, но это не вопрос :) Я ненавижу перерыв и продолжаю: P – TecHunter

+1

Это не вопрос, но сторона примечания всегда принимается, программисты должны знать, где они делают что-то не так;) – BackSlash

0

Прежде всего, пожалуйста, используйте итератор для петель (см: http://viralpatel.net/blogs/java-read-write-excel-file-apache-poi/)

Второе: Вы, возможно, придется сделать так чтобы остановить цикл.

private void remove() { 
    HSSFWorkbook wb = null; 
    HSSFSheet sheet = null; 
    try { 
     FileInputStream is = new FileInputStream("C:/juni.xls"); 
     wb = new HSSFWorkbook(is); 
     sheet = wb.getSheetAt(0); 
     for (Row row : sheet) { 
      boolean stop = false; 
      for (Cell cell : row) { 
       if (cell.getCellType() == Cell.CELL_TYPE_STRING) { 
        if (cell.getRichStringCellValue().getString().trim().contains("POST")) { 
         row_count_post_1 = row.getRowNum(); 
         DashBoard.txt.setText("Processed the STRING \"POST\" on Row#" + row_count_post_1); 
         HSSFRow removingRow = sheet.getRow(row_count_post_1); 
         if (removingRow != null) { 
          sheet.removeRow(removingRow); 
         } 
         int lastIndex = sheet.getLastRowNum(); 
         sheet.shiftRows(row_count_post_1 + 1, lastIndex, -1); 
        } else { 
         stop = true; 
         break; 
        } 
       } 
       if (stop) { 
        break; 
       } 
      } 
     } 
    } catch (Exception e) { 
     //do catch for no exception 
    } 
} 
+0

Ваш код не компилируется. Тип 'flag' не существует, возможно, вы хотели написать' boolean'? – BackSlash

+0

Я исправил его сейчас, спасибо. –

1

Поскольку нет коды после окончания первого цикла вы хотите break от просто return.

} else { 
    return; 
} 

Хотя ярлыки и разрывы на ярлык являются синтаксисом, я бы воздержался от такого контроля потока. Согласно Dijkstra, количество ошибок в коде пропорционально числу операторов goto (и этот разрыв является его версией). Я просто хочу сказать: будьте осторожны с этим. Если вы должны иметь аналогичное управление потоком, попробуйте реализовать его с помощью флагов.

2

Вы можете использовать break с меткой для внешнего контура.

Пожалуйста, обратите внимание на @ джон-Скит answer Или это example от Javadoc