По сути, я запускаю несколько тестов для простой игры CLI, которую создаю, и изначально все мои переменные / объекты были объявлены в начале метода main()
. Теперь мне нужно создать новый метод, который использует некоторые из тех же объектов / переменных, поэтому я решил переместить все свои переменные из main()
и сделать их статическими / глобальными. При этом я столкнулся с проблемой: несмотря на main()
бросание FileNotFoundException
, я получал следующее сообщение об ошибке:
Tests.java:14: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
static Scanner boardReader = new Scanner(board);
Вот мой код, вплоть до проблемы c line:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
class Tests {
// GAME OBJECTS AND VARIABLES
// The following is used for reading, displaying, and writing to the game board.
static File board = new File("Board.txt");
static Scanner boardReader = new Scanner(board);
static FileWriter boardWriter = null;
static StringBuilder boardBuilder = new StringBuilder((int)board.length());
static String boardDisplay = null; // This String allows boardContents to print in a more readable way.
static String boardContents = null; // This is Board.txt represented as a String.
// There are more variables here than shown, but these are the ones relevant to my problem.
// GAMEPLAY
public static void main(String[] args) throws FileNotFoundException, IOException {
boolean gameIsOngoing = true;
while(gameIsOngoing) {
// boardContents String from boardBuilder StringBuilder
while (boardReader.hasNextLine()) {
boardContents = (boardBuilder.append(boardReader.nextLine() + System.lineSeparator()).toString());
}
// More irrelevant code here.
}
}
}
Пытаясь решить эту проблему, я попытался поместить код, использующий boardReader, в соответствующий try-catch, как показано здесь:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;
class Tests {
// GAME OBJECTS AND VARIABLES
// The following is used for reading, displaying, and writing to the game board.
static File board = new File("Board.txt");
static FileWriter boardWriter = null;
static StringBuilder boardBuilder = new StringBuilder((int)board.length());
static String boardDisplay = null; // This String allows boardContents to print in a more readable way.
static String boardContents = null; // This is Board.txt represented as a String.
// There are more variables here than shown, but these are the ones relevant to my problem.
// GAMEPLAY
public static void main(String[] args) throws IOException {
boolean gameIsOngoing = true;
while(gameIsOngoing) {
// boardContents String from boardBuilder StringBuilder
try (Scanner boardReader = new Scanner(board)) {
while (boardReader.hasNextLine()) {
boardContents = (boardBuilder.append(boardReader.nextLine() + System.lineSeparator()).toString());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// More irrelevant code here.
}
}
}
Что работает, но это делает мой код менее читабельным, поскольку объект Scanner больше не отображается среди всех других объектов. Думаю, мой вопрос: почему не работает первый код? Возможно ли, чтобы что-то похожее на это работало?
Я также хочу быстро упомянуть, что при исследовании этого вопроса я видел некоторые вещи, говорящие о том, что, как правило, плохая практика, чтобы объекты Scanner были глобальными / stati c. Я полагал, что, поскольку этот конкретный сканер не собирает вводимые пользователем данные (а у меня нет планов по поддержанию этого относительно простого проекта после завершения), это не будет слишком проблематично. c.
Изменить: я не знаю почему, но редактор не позволяет мне поставить «Привет» в начале этого поста, так что вот оно ... всем привет :)