Невозможно объявить глобальный статический c объект сканера без выброса исключения FileNotFoundException? - PullRequest
0 голосов
/ 05 августа 2020

По сути, я запускаю несколько тестов для простой игры 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.

Изменить: я не знаю почему, но редактор не позволяет мне поставить «Привет» в начале этого поста, так что вот оно ... всем привет :)

1 Ответ

0 голосов
/ 05 августа 2020

Ошибка, потому что исключение не перехвачено. Экземпляр Scanner создается в контексте класса Tests, основной метод - это нечто иное, поэтому его перехват не решит проблему.

Если вам нужен обходной путь, вы можете попробовать что-то вроде этого:

static {
    try {
        boardReader = new Scanner(board);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...