Java попробуй и поймать проблему ioException
-
25-09-2019 - |
Вопрос
Я пытаюсь использовать немного кода, который я нашел внизу эта страница. Отказ Вот код в классе, который я создал для него:
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);
С этой попыткой я получаю ошибку «нерепуртированный исключение Java.io.ioException; должны быть пойманы или объявлены, чтобы быть брошены». Я не понимаю, почему я получаю это, потому что, как я вижу, исключение объявлено в моем методе «CONCTLINES». Я пытался использовать попытку CALL Block прямо под этим последним битом кода, который я разместил, но это тоже не работал (я не думаю, что сделал это правильно). Вот моя попытка поймать попытку:
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);
}
}
Пожалуйста, покажите мне путь! Заранее спасибо за вашу помощь!
Решение
Блок инициализатора работает как любые биты кода; Это не «прикреплено» к любому полю / методу, предшествующему ему. Чтобы назначить значения на поля, вы должны явно использовать поле в качестве 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 ваших методов COCCLINES. Вы захотите сделать что-то вроде этого:
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 из основных
public class MyClass {
private int lineCount;
public static void main(String[] args) throws IOException {
lineCount = LineCounter.countLines(sFileName);
}
}
Или это, чтобы справиться с ним и обернуть его в незарегистрированном нелегалярную функцию:
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);
}
}
}