Я пытаюсь использовать немного кода, который я нашел у основания этой страницы. Вот код в классе, который я создал для него:
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; должен быть пойман или, как объявлять, брошен". Я не понимаю, почему я получаю это, потому что, как я вижу, исключение объявляется в моем "countLines" методе. Я пытался использовать блок выгоды попытки прямо под тем последним битом кода, который я отправил, но это не работало ни один (я не думаю, что сделал его правильно хотя). Вот моя попытка выгоды попытки:
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);
}
}
Покажите мне путь! Заранее спасибо за Вашу справку!
Блок инициализатора подобен любым битам кода; он не «привязан» к какому-либо предшествующему полю / методу. Чтобы присвоить значения полям, вы должны явно использовать это поле в качестве левой части оператора присваивания.
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);
}
}
}