在Java中处理静态变量不可能值的最佳实践?

在Java中处理静态变量不可能值的最佳实践?,java,error-handling,static,exit,Java,Error Handling,Static,Exit,(这个问题不是关于如何做,而是应该如何做。) 我正在实施一个创建决策树的程序。有不同的方法可以构建树,所以我有一个静态变量“type”,它被分配到main函数中。在节点类构造函数中,我有一个switch语句,它检查这个类型变量的值,并执行相应的操作 我想知道处理该值与任何预设选项不匹配的情况的最佳方法(“默认”情况)。这应该是不可能的,可能永远也不会执行,但我还是想做对。如果发生这种情况,我希望它打印一条消息并终止程序 我知道我可以通过简单地抛出一个错误并抓住它的主要部分来做到这一点,但对于一些

(这个问题不是关于如何做,而是应该如何做。)

我正在实施一个创建决策树的程序。有不同的方法可以构建树,所以我有一个静态变量“type”,它被分配到main函数中。在节点类构造函数中,我有一个switch语句,它检查这个类型变量的值,并执行相应的操作

我想知道处理该值与任何预设选项不匹配的情况的最佳方法(“默认”情况)。这应该是不可能的,可能永远也不会执行,但我还是想做对。如果发生这种情况,我希望它打印一条消息并终止程序

我知道我可以通过简单地抛出一个错误并抓住它的主要部分来做到这一点,但对于一些不应该发生的事情来说,这似乎不是直觉。“System.exit(1)”是我需要的吗

public class Node {
    // some attributes

    public static int type;
    public static final int TYPE1 = 0;
    public static final int TYPE2 = 1;

    public Node(**arguments**){
        // do some stuff first

        switch(this.type){
            case Node.TYPE1:
                splitType1();
                break;
            case Node.TYPE2:
                splitType2();
                break;
            default:
                // unrecognized type
                System.err.print("Error: Unrecognized type");
                System.exit(1);
        }

        // do some more stuff
    }
}

其中一种方法是将代码放入
Try
Catch
Finally
块。
default
案例中设置标志,并在
finally
块中相应地处理错误。

方法之一是将代码放入
Try
Catch
finally
块。 在
default
案例中设置标志,并在
finally
块中相应地处理错误。

抛出异常,不捕获它。让它一路传播。如果你认为不可能发生的事情,那么你应该完全没有信心,你有能力“处理”它…世界被搞得一团糟

<>代码> ILLaltStaleExtExabor /Cult>对这个有一定的适用性,尽管您可能还想考虑使用<代码> AddiaSturror < /C> >,如果它真的是不可能的话。(请考虑您是否希望任何捕获普通
异常的代码尝试处理此情况-如果不希望,则
错误
是合适的。)

在本例中,假设您有一个公共静态变量,任何代码都可以更改它并将其置于无效状态<因此,代码>非法状态例外
更为合理

但是,如果更改了代码,使变量是私有的,并且更改其值的方法都验证了在设置该值之前,该值已变为
0
1
,则更适合使用
AssertionError

(请注意,我个人会将枚举用于某个可以是一组固定值之一的对象。这限制了它出错的能力…

抛出异常,但不捕获它。让它一路传播下去。如果你认为不可能发生的事情,那么你应该完全没有信心,你有能力“处理”它…世界被搞得一团糟

<>代码> ILLaltStaleExtExabor /Cult>对这个有一定的适用性,尽管您可能还想考虑使用<代码> AddiaSturror < /C> >,如果它真的是不可能的话。(请考虑您是否希望任何捕获普通
异常的代码尝试处理此情况-如果不希望,则
错误
是合适的。)

在本例中,假设您有一个公共静态变量,任何代码都可以更改它并将其置于无效状态<因此,代码>非法状态例外
更为合理

但是,如果您更改了代码,使变量是私有的,并且更改其值的方法都验证了该值在设置之前变为
0
1
,则
AssertionError
更合适


(请注意,我个人会将枚举用于某个可以是固定值集之一的对象。这限制了它出错的能力…

这就是异常的用途。@hot-licks:我理解,但如果这是一个致命错误,那么必须使用try-catch语句将其传播回main似乎违反直觉;特别是对于可能永远不会发生的情况。诚然,在本例中,节点的构造函数是直接从main调用的,所以这并不遥远,但问题的意思是更一般的。线程中的默认异常处理程序生成堆栈转储,这对于调试非常有用。这一切几乎都是免费发生的——不需要try/catch。这就是例外情况。@hot-licks:我理解,但如果这是一个致命错误,那么必须使用try-catch语句将其传播回main似乎是违反直觉的;特别是对于可能永远不会发生的情况。诚然,在本例中,节点的构造函数是直接从main调用的,所以这并不遥远,但问题的意思是更一般的。线程中的默认异常处理程序生成堆栈转储,这对于调试非常有用。这一切几乎都是免费的——不需要尝试/捕获。这似乎是处理这一切的最佳方式。也感谢您提供有关enum的提示。这似乎是处理它的最佳方法。也感谢您提供有关enum的提示。