Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查非法状态异常的正确使用?_Java_Exception_Illegalstateexception - Fatal编程技术网

Java 检查非法状态异常的正确使用?

Java 检查非法状态异常的正确使用?,java,exception,illegalstateexception,Java,Exception,Illegalstateexception,下面是CompleteGraph的代码,它基本上接收节点列表,然后接收所有节点的邻接/边。有一个名为getAdj的函数抛出非法状态,原因很简单,根据逻辑,graph仍在构建中,而use甚至在用户完全构建之前就调用了该函数。这是使用非法国家的正确决定吗 public class CompleteGraph<T> { private final Map<T, HashMap<T, Double>> graph; private Set<T&

下面是CompleteGraph的代码,它基本上接收节点列表,然后接收所有节点的邻接/边。有一个名为
getAdj
的函数抛出非法状态,原因很简单,根据逻辑,graph仍在构建中,而use甚至在用户完全构建之前就调用了该函数。这是使用非法国家的正确决定吗

public class CompleteGraph<T> {

    private final Map<T, HashMap<T, Double>> graph;
    private Set<T> nodes;

    public CompleteGraph() {
        graph = new HashMap<T, HashMap<T, Double>>();
    } 

    public void addNodes (Set<T> nodes) {
        if (nodes == null) throw new NullPointerException("The node cannot be null.");
        if (nodes.size() == 0) throw new NullPointerException("The size of node cannot be zero.");
        this.nodes = nodes;
    }

    public void addEdges (T nodeId, Map<T, Double> addEdges) {
        if (!nodes.contains(nodeId)) throw new NoSuchElementException("The source node: " + nodeId +  " does not exist.");

        for (T node : addEdges.keySet()) {
            if (!nodes.contains(node)) throw new NoSuchElementException("The target node: " + nodeId + "  not exist.");
        }

        graph.put(nodeId, (HashMap<T, Double>) addEdges);
    }

    public Map<T, Double> getAdj (T nodeId) {
        if (!nodes.contains(nodeId)) throw new NoSuchElementException("The node " + nodeId + " does not exist.");
        if (!graph.containsKey(nodeId)) throw new IllegalStateException("The graph is not populated with " + nodeId); 

        return graph.get(nodeId);
    }
}
public类CompleteGraph{
私有最终映射图;
私有集节点;
公共CompleteGraph(){
graph=新的HashMap();
} 
公共void addNodes(设置节点){
如果(nodes==null)抛出新的NullPointerException(“该节点不能为null”);
如果(nodes.size()==0)抛出新的NullPointerException(“节点的大小不能为零”);
this.nodes=节点;
}
公共无效添加(T节点ID、映射添加){
如果(!nodes.contains(nodeId))抛出新的NoSuchElementException(“源节点:“+nodeId+”不存在”);
for(T node:addEdges.keySet()){
如果(!nodes.contains(node))抛出新的NoSuchElementException(“目标节点:“+nodeId+”不存在”);
}
put(nodeId,(HashMap)加法);
}
公共地图getAdj(T节点ID){
如果(!nodes.contains(nodeId))抛出新的NoSuchElementException(“节点”+nodeId+“不存在”);
如果(!graph.containsKey(nodeId))抛出新的IllegalStateException(“该图未填充“+nodeId”);
返回图.get(nodeId);
}
}

主要的设计问题不是使用异常。主要的设计问题是,您有一个addNodes()方法来替换节点,而不是添加节点,并且您强制调用方使用两个不同的方法(按正确的顺序)来填充图形,使其在构造函数调用后和第一个方法调用后处于不一致的状态。构造器应该使图形保持正确的状态,并且每个方法调用都应该将图形状态迁移到另一个一致的状态。这个问题似乎与主题无关,因为它属于