Optimizar código al lanzar варьируется недостатки la misma excepción en un mismo método

Estoy creando una implementando de un grafo genérico en Java, para hacer un proyecto mas adelante utilizando esta estructura de datos. Pero al avanzar e ir creando Лос métodos del grafo (Estoy intentando hacer la implementacion подставляют Листу de adyacencia), меня он, encontrado подставляют танго que en un mismo método o función que lanzar, варьируется недостатки la misma Excepción, la cual es NullPointerException, pero en diferentes situaciones, СИ se llegan предъявитель, claro esta.

Ми Entonces pregunta es: ¿Puedo оптимизатор todos todos esos еще que, я lanzan NullPointerException, en соло uno? ya que el código Комо lo muestro никакой se ve, ми параграфа, muy презентабельный y, la verdad, utilizar Excepciones никакое ми es que sea punto fuerte en programación.

 @Override
public void addEdge(Vertex<K, V> source, Vertex<K, V> destination, double weight) throws KeyNotFoundException {
    if (source != null){
        if (destination != null){

            if (source.getKey() != null){
                if (destination.getKey() != null){

                    if (isInGraph(source.getKey())){
                        if (isInGraph(destination.getKey())){

                            Edge<K,V> edge = new Edge<>(source, destination, weight);
                            this.adjacencyList.get(source.getKey()).add(edge);

                            if (!isDirected){
                                Edge<K,V> edge2 = new Edge<>(destination, source, weight);
                                this.adjacencyList.get(destination.getKey()).add(edge2);
                            }
                            this.numberOfEdges++;

                        }else {
                            throw new KeyNotFoundException("El parametro key del objeto Destination no se encontro.");
                        }
                    }else {
                        throw new KeyNotFoundException("El parametro key del objeto Source no se encontro.");
                    }

                }else {
                    throw new NullPointerException("El objeto Destination, en su parametro key, es nulo!");
                }
            }else {
                throw new NullPointerException("El objeto Source, en su parametro key, es nulo!");
            }

        }else {
            throw new NullPointerException("El objeto Destination es nulo!");
        }
    }else {
        throw new NullPointerException("El objeto Source es nulo!");
    }
}

Алгоритм СИ Por:

  • El objeto lanzado KeyNotFoundException es una excepción propia.
  • El objeto llamado adjacencyList es un HashTable que tiene ключ Комо параметро ООН del objeto вершина, y значение Комо una List de objetos Edge
  • СИ se preguntan porque загар сои especifico en remarcar que objeto es el que esta nulo, es para poder mostrarselo tambien al usuario, y параграф guiarme mas facilmente, mas adelante, cuando empiece подставляет el proyecto que usara esta implmentacion de Grafo.
4
задан 20.12.2019, 05:28
1 ответ

AquГ - есть несколько вещей, которые могут быть улучшенными:

  1. делает мне немного странным, что ты бросаешь NullPointerException, обычно используют как convenciГіn IllegalArgumentException, когда parГЎmetro одного mГ©todo он не будет состоять vГЎlido из-за нее razГіn в том, чтобы он был (недействительный, ранг invГЎlido, и т.д.) Лучше aГєn, если ты используешь исключения, настроенные для тебя aplicaciГіn, если ты хочешь, чтобы было вынуждено задержание excepciГіn, так как как NullPointerException, так и IllegalArgumentException - исключения runtime и не estГЎs обязано захватывать их.
  2. Проверки parГЎmetros, которые ты делаешь в первых двух сцепленных ifs, просто проверяют стоимость ввода перед тем, как не делать ни одной им transformaciГіn, и в случае, если они не будут правильны ты не будешь выходить немедленно mГ©todo бросая одну excepciГіn, а следовательно ты можешь делать что-то asГ-:
/**
 * Valida si un valor es nulo y en caso de que lo sea lanza una excepción.
 * @param value Valor a comprobar
 * @param name Nombre del parámetro
 * @throws IllegalArgumentException En caso de que el valor sea nulo.
 */
private void validarNulo(Object value, String name) throws IllegalArgumentException {
  if (value == null) {
    throw new IllegalArgumentException(name + " es nulo");
  }
}

/**
 * Valida si un vértice está en el grafo y en caso de estarlo lanza una excepción.
 * @param vertex Vértice a comprobar
 * @param name Nombre del parámetro
 * @throws KeyNotFoundException En caso de que el vértice esté en el grafo.
 */
private void validarEstaEnGrafo(Vertex<K, V> vertex, String name) throws KeyNotFoundException{
  if (isInGraph(vertex.getKey())){
    throw new KeyNotFoundException("El parametro key del objeto " + name " + no se encontró.");
  } 
}

@Override
public void addEdge(Vertex<K, V> source, Vertex<K, V> destination, double weight) throws KeyNotFoundException, IllegalArgumentException {

  // Primero valido todo lo necesario para que funcione mi método
  // Tiene pinta que las validaciones se van a hacer muchas veces, así que creo un par de métodos privado para no repetir tanto código.

  validarNulo(source, "source");
  validarNulo(destination, "destination");

  validarEstaEnGrafo(source, "source");
  validarEstaEnGrafo(destination, "destination");


  // A partir de aquí puedo asumir que todos los parámetros de entrada son válidos, sigo con el resto del método sin incrementar la complejidad

  Edge<K,V> edge = new Edge<>(source, destination, weight);
  this.adjacencyList.get(source.getKey()).add(edge);
  if (!isDirected){
    Edge<K,V> edge2 = new Edge<>(destination, source, weight);
    this.adjacencyList.get(destination.getKey()).add(edge2);
  }
  this.numberOfEdges++;
}

Таким образом ты не увеличиваешь комплексность ciclomГЎtica тебя mГ©todo без необходимости (ВїquГ© pasarГ, - если бы у тебя были 7 parГЎmetros?) и главная часть тебя mГ©todo estarГ - в на первом уровне indentaciГіn облегчая Ваше чтение.

4
ответ дан 21.12.2019, 12:13