#java
#java
Вопрос:
ниже приведена часть моего кода
if(search_result.contains(num_per_page_str)) { // if num item per page is => 24,
for(int item = 1 ; item <= num_per_page_int ; item ) { //interate over the current page
Thread.sleep(3000);
try {//if display vertical horizontal
WebElement url = driver.findElement(By.linkText(item_desc)); // get the URL via element
String item_URL = url.getAttribute("href");
System.out.println("Item URL = " item_URL);
getPrice(driver, item_URL);
} //try
catch (Exception e) { //if display vertical only
WebElement url = driver.findElement(By.linkText(item_desc)); // get the URL via element
String item_URL = url.getAttribute("href");
System.out.println("Item URL = " item_URL);
getPrice(driver, item_URL);
} //catch
} // for int item = 1
} //if search result
else { //if items per page < 24
}//else
После достижения ветки try / catch getPrice(driver, item_URL);
я ожидаю, что она вызовет функцию getPrice вместе с аргументами.
Однако то, что я получаю сейчас, заключается в том, что при выполнении вызова функции getPrice() она не выходит из цикла for и повторяет цикл.
Я делаю что-то не так в своем коде, что блокирует выход из цикла for? Спасибо
Комментарии:
1. Вы можете переместить try-catch таким образом, чтобы он обтекал цикл. Затем, при выходе из
catch
блока, он будет снаружи.try { for (...) { ... } } catch (...) { ... }
. Конечно, у вас больше не будетitem_URL
then. Вы также можете просто использоватьbreak;
для выхода из цикла.2. использовать
break
инструкцию3. @Zabuzard Спасибо за совет. Просто интересно, есть ли какие-либо проблемы в моем кодировании, чтобы я мог избежать этого в будущем?
4. @B.M Это кажется хорошим способом. Я попробую это сделать и проинформирую вас.
5. Это только я или
try
иcatch
блоки точно такие же? Какова логика, стоящая за этим? Еслиtry
блок выйдет из строя, тоcatch
тоже выйдет из строя, нет?
Ответ №1:
Добавьте перерыв после вызова getPrive, например:
for(int item = 1 ; item <= num_per_page_int ; item ) { //interate over the current page
Thread.sleep(3000);
try {//if display vertical horizontal
WebElement url = driver.findElement(By.linkText(item_desc)); // get the URL via element
String item_URL = url.getAttribute("href");
System.out.println("Item URL = " item_URL);
getPrice(driver, item_URL);
break;
} //try
catch (Exception e) { //if display vertical only
WebElement url = driver.findElement(By.linkText(item_desc)); // get the URL via element
String item_URL = url.getAttribute("href");
System.out.println("Item URL = " item_URL);
getPrice(driver, item_URL);
break;
} //catch
} // for int item = 1
Комментарии:
1. при
finally { break; }
этом он всегда будет прерываться, даже если ошибки вообще не было. Это означает, что цикл устарел, поскольку он всегда будет выполнять только одну итерацию. Вместо этого переместитеbreak
вcatch
блок.2. @Linh, мои пологии. Возможно, я упускаю некоторую информацию из своих вопросов. Что мне нужно сделать, так это то, что как только я достигну функции getPrice(), мне нужно выйти из цикла for, перейти к getPrice(), чтобы продолжить выполнение некоторой задачи, а затем вернуться обратно в цикл for . Но спасибо и за ваш совет.
3. Насколько я понимаю, автор хочет выйти из цикла после выполнения getPrice в блоке try{}
4. @LinhNguyen Правильно. Но ваш код этого не делает.
finally
выполняется всегда. В обоих случаяхcatch
был введен if, но также не был введен if catch.5. Вы правы. break; должен добавляться сразу после каждого getPrice()