java—如何处理javabeanintegerproperty中的异常

7uzetpgm  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(256)

我的项目分为两个模块:
在模型模块中:我有一个类 SudokuField 这说明 SudokuBoard 当改变的时候。然后,如果启用了提示, SudokuBoard 投掷 SudokuException 如果不可能用插入值来解数独的话。 SudokuField 通知:

public class SudokuField {

    private int value = 0;
    private PropertyChangeSupport notifier;

     public void setValue(int value) {

        if (value < 0 || value > 9) {
            throw new IndexOutOfBoundsException("Number: " + value + "Expected 0-9");
        }

        int oldValue = this.value;
        this.value = value;
        notifier.firePropertyChange("value", oldValue, value);

    }
}
``` `SudokuBoard` 投掷:

public class SudokuBoard implements PropertyChangeListener{

public static final int SIZE = 9;

@Override
public void propertyChange(PropertyChangeEvent evt) throws SudokuException {
    if (!autoCheck) {
        return;
    }
    if (checkBoard()) {
        return;
    }

    int oldValue = (int) evt.getOldValue();
    int newValue = (int) evt.getNewValue();

    SudokuField field = (SudokuField) evt.getSource();
    int i=0, j=0;
    outerloop:
    for (i = 0; i < SudokuBoard.SIZE; i++) {
        for (j = 0; j < SudokuBoard.SIZE; j++) {
            if (this.getField(i, j) == field ) {
                break outerloop;
            }
        }
    }

    throw new SudokuException(
            "Wrong value inserted"
                    + "(old: " + oldValue
                    + ", new: " + newValue + ")",
                    i, j, oldValue, newValue, field);

}

}

视图模块:我使用javafx和javabean来显示和同步 `SudokuField` 以及 `TextField` . 控制器的一部分:

public class Window implements Initializable {

@FXML
private GridPane sudokuPane;

private final SudokuBoard board = new SudokuBoard(new BacktrackingSudokuSolver());
private final List<List<TextField>> fields = Arrays.asList(new List[9]);
private final List<JavaBeanIntegerProperty> integerProperties =
        new ArrayList<JavaBeanIntegerProperty>();

public Window() {
    for (int i = 0; i < SudokuBoard.SIZE; i++) {
        fields.set(i, Arrays.asList(new TextField[9]));
        for (int j = 0; j < SudokuBoard.SIZE; j++) {
            TextField textField = new TextField();
            fields.get(i).set(j, textField);
        }
    }
}

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {

    StringConverter converter = new IntegerStringConverter();

    for (int i = 0; i < SudokuBoard.SIZE; i++) {
        for (int j = 0; j < SudokuBoard.SIZE; j++) {
            //I generate Sudoku board and TextFields in Constructor
            TextField textField = getTextField(i, j);
            SudokuField field = board.getField(i, j);

            JavaBeanIntegerPropertyBuilder builder = JavaBeanIntegerPropertyBuilder.create();
            JavaBeanIntegerProperty integerProperty = null;
            try {
                integerProperty = builder.bean(field).name("value").build();
            } catch (NoSuchMethodException e) {
                System.out.println("Ignoring NoSuchMethodException in " + this.getClass());
            }

            //i need to store JavaBeanIntegerProperty, otherwise GarbageCollector
            //destroys my connections
            integerProperties.add(integerProperty);

            //adding textField to GridPane
            sudokuPane.add(textField, i, j);
            textField.textProperty().bindBidirectional(integerProperty, converter);
        }
    }
}

}

现在的大问题是:如何处理这些问题 `SudokuExceptions` 在控制器的某个地方?从这个异常中,我可以很容易地获得任何信息来修改所需的textfield,但是我不能处理它。我试着加上:

Thread.setDefaultUncaughtExceptionHandler(Window::exceptionHandler);
//and
Thread.currentThread().setDefaultUncaughtExceptionHandler(Window::exceptionHandler);
``` exceptionHandler 中的方法 Window 控制器:

public static void exceptionHandler(Thread thread, Throwable throwable) {

        for (int i = 0; i < 100; i++) {
            System.out.println("working: " + i);
        }

    }

initialize 控制器的构造方法,以及 Main 视图模块的类 main 以及 start 方法,但它没有调用这个方法(我用 System.out.println ). 我不想补充 PropertyChangeListenerSudokuBoard ,因为我希望对模型模块进行尽可能小的更改。
整个项目是作为我大学课程的一部分开发的项目。

balp4ylt

balp4ylt1#

好吧,我找到了这个错误报告,我想因为这个,我不能做我想要的。所以我创造了我自己的 ActionEvent 是“抛出”而不是 SudokuExceptionSudokuBoard 并补充道 ActionEventListener 我的控制器接口。也许这不是我真正想要的解决方案,但我觉得它更漂亮。特别感谢我的朋友帮助我。我将保留这个问题,因为可能有人知道如何绕过这个异常处理问题,其他人可以使用这个答案。

相关问题