Java пытается поймать проблему IOException
Я пытаюсь использовать немного кода, который я нашел на дне на этой странице. Вот код в классе, который я создал для него:
import java.io.LineNumberReader;
import java.io.FileReader;
import java.io.IOException;
public class LineCounter {
public static int countLines(String filename) throws IOException {
LineNumberReader reader = new LineNumberReader(new FileReader(filename));
int cnt = 0;
String lineRead = "";
while ((lineRead = reader.readLine()) != null) {}
cnt = reader.getLineNumber();
reader.close();
return cnt;
}
}
моя цель-подсчитать строки текстового файла, сохранить это число как целое, а затем использовать это целое число в моем основном классе. в моем основном классе я попробовал несколько разных способов сделать это, но (будучи новым программистом) мне чего-то не хватает. Вот первое, что я попробовал:
String sFileName = "MyTextFile.txt";
private int lineCount = LineCounter.countLines(sFileName);
С этой попыткой я получаю ошибку " unreported exception java.Ио.IOException; должен быть пойман или объявлен брошенным."Я не понимаю, почему я получаю это, потому что, как я вижу, исключение объявлено в моем методе "countLines". Я попытался использовать блок try catch прямо под этим последним битом кода, который я опубликовал, но это тоже не сработало (я не думаю, что сделал это правильно). Вот моя попытка поймать попытку:
String sFileName = "MyTextFile.txt";
private int lineCount;{
try{
LineCounter.countLines(sFileName);
}
catch(IOException ex){
System.out.println (ex.toString());
System.out.println("Could not find file " + sFileName);
}
}
пожалуйста, покажите мне дорогу! Заранее спасибо за помощь!
3 ответов
блок инициализатора похож на любые биты кода; он не "прикреплен" к любому полю/методу, предшествующему ему. Чтобы присвоить полям значения, необходимо явно использовать поле в качестве lhs инструкции присваивания.
private int lineCount; {
try{
lineCount = LineCounter.countLines(sFileName);
/*^^^^^^^*/
}
catch(IOException ex){
System.out.println (ex.toString());
System.out.println("Could not find file " + sFileName);
}
}
кроме того,countLines
можно сделать проще:
public static int countLines(String filename) throws IOException {
LineNumberReader reader = new LineNumberReader(new FileReader(filename));
while (reader.readLine() != null) {}
reader.close();
return reader.getLineNumber();
}
основываясь на моем тесте, похоже, что вы можете getLineNumber()
после close()
.
причина, по которой вы получаете исключение IOException, заключается в том, что вы не ловите исключение IOException вашего метода countLines. Вы захотите сделать что-то вроде этого:
public static void main(String[] args) {
int lines = 0;
// TODO - Need to get the filename to populate sFileName. Could
// come from the command line arguments.
try {
lines = LineCounter.countLines(sFileName);
}
catch(IOException ex){
System.out.println (ex.toString());
System.out.println("Could not find file " + sFileName);
}
if(lines > 0) {
// Do rest of program.
}
}
код countLines(String filename)
метод вызывает исключение IOException.
вы не можете использовать его в декларации члены. Вам нужно будет выполнить операцию в main(String[] args)
метод.
код main(String[] args)
метод получит исключение IOException, брошенное ему countLines, и ему нужно будет обработать или объявить его.
попробуйте это, чтобы просто бросить IOException из main
public class MyClass {
private int lineCount;
public static void main(String[] args) throws IOException {
lineCount = LineCounter.countLines(sFileName);
}
}
или это, чтобы обработать его и обернуть его в непроверенное IllegalArgumentException:
public class MyClass {
private int lineCount;
private String sFileName = "myfile";
public static void main(String[] args) throws IOException {
try {
lineCount = LineCounter.countLines(sFileName);
} catch (IOException e) {
throw new IllegalArgumentException("Unable to load " + sFileName, e);
}
}
}