Наконец я нашел решение этой проблемы. Вот мой обновленный код
Map<Integer, Object[]> data = new TreeMap<Integer, Object[]>();
int i = 1;
for(Row r1 : sheet) {
//This is for empty cell value
String c3;
if(r1.getCell(column_index_3) == null)
c3 = " ";
else
c3 = r1.getCell(column_index_3).getStringCellValue();
data.put(i, new Object[]{ r1.getCell(column_index_1).getStringCellValue(), r1.getCell(column_index_2).getStringCellValue(), c3});
i++;
}
Set<Integer> keyset = data.keySet();
int rownum = 0;
for (Integer key : keyset) {
// this creates a new row in the sheet
Row row1 = sheet1.createRow(rownum++);
Object[] objArr = data.get(key);
int cellnum = 0;
for (Object obj : objArr) {
// this line creates a cell in the next column of that row
Cell cell = row1.createCell(cellnum++);
if (obj instanceof String)
cell.setCellValue((String)obj);
else if (obj instanceof Integer)
cell.setCellValue((Integer)obj);
}
}
try {
// this Writes the workbook gfgcontribute
FileOutputStream out = new FileOutputStream(new File("E:\\Dharshan/test.xlsx"));
wb.write(out);
out.close();
System.out.println("test.xlsx written successfully on disk.");
}
catch (Exception e) {
e.printStackTrace();
}
}
Если поток умирает из-за неперехваченного исключения, ответ прост: поймайте исключение в соответствующем месте так, чтобы можно было продолжать идти. Или поймайте исключение в рамках своего searchfile метода или сделайте вызов метода выполнения searchfile в цикле.
Если Вы хотите, чтобы Ваш поток продолжал бежать, используют цикл.
public void run() {
while(!Thread.interrupted())
try {
searchfile();
}
catch(Exception e) {
e.printStackTrace();
}
}
В Вашей выгоде можно переместиться, файл к ошибочной папке затем создают новый объект того же потока и запускают его снова.
если я не понял Вас превратно, Ваш код пропускает "продолжать управлять" природу, т.е. у Вас должен быть цикл где-нибудь:
public static void main(String[] args){
ExecutorService service = Executors.newFixedThreadPool(4);
// for each of your 4 folders
while (true) {
Future<File> searchResult = service.submit(new SearchTask());
try {
File foundFile = searchResult.get();
// handle found file
} catch (Exception e) {
// handle exception
}
}
}
private static class SearchTask implements Callable<File> {
@Override
public File call() {
return searchFile();
}
public File searchFile() {
// search & return found file
}
}
обратите внимание, что это - просто очень простое расширение Вашего примера. это все еще пропускает параметризацию SearchTask, чтобы на самом деле быть специфичным для папки, обработки файлов и исключений, и т.д., как упомянуто в предыдущих ответах, Ваш SearchTask должен реализовать Выполнимый (я предпочитаю Вызываемый...), и по моему скромному мнению всегда лучше использовать ExecutorService, чем породить потоки вручную.надеюсь, это поможет...
Вы сказали, что исключение может быть выдано во время процесса файла, таким образом, я поместил processFile()
в блоке try-catch. но если это может быть брошено во время поиска, можно поместить его в выгоду попытки также.
public void run() {
while(!terminated) {
findNextFile();
try {
processFile();
} catch {
// handle error
}
}
}
Вот мои предположения на основе Вашего вопроса и Вашего разъяснения:
run()
метод, только вызовы searchfile()
однажды а не в циклеsearchfile()
метод имеет цикл в нем, и Вы хотите, чтобы тот цикл продолжил работать, даже если исключение выдается в нем.searchfile()
не объявляет, что это бросает любого Exception
System.out
(хотя использование платформы журналирования является Действительно Хорошей Идеейfor()
цикл нижеС этими предположениями Вы не хотите планировать поймать Exception
в Вашем run()
метод за исключением цели зарегистрировать это что-то пошло очень неправильно:
public void run() {
try {
searchfile();
} catch (RuntimeException e) {
System.out.println("Something went very wrong! Unexpected RuntimeException");
e.printStackTrace();
}
}
Обратите внимание, что код ловит RuntimeException
. Всегда ловите самое определенное Exception
это сделает то, в чем Вы нуждаетесь. Затем то, в чем Вы нуждаетесь, является чем-то, таким как следующее в Вашем searchfile()
метод:
File[] files = directory.listFiles();
for (File file : files) {
try {
// Do your normal file/directory processing here
} catch (Exception e) {
System.out.println("Exception processing file " + file.getName() + " " + e);
// Move "file" to another area
}
}
Так как Вы захватываете неожиданный Exception
s в основном цикле Вашего Thread
, Ваш поток продолжит обрабатывать после обработки Exception
.
Я не совсем уверен, сработает ли это, но вот попытка.
public void run() {
try {
searchFile();
} catch(Exeption e) {
e.printStackTrace();
if(!Thread.currentThread().isAlive())
Thread.currentThread().start();
}
}