Исключение действуя с (обновленным) grafo

Хорошие, я моделирую виртуальному grafo, функция которого состоит в том, чтобы приуменьшать вес корабля. Как он говорит титул вопроса, выполнив код, меня отпускает это исключение: "IllegalArgumentException". Из чего он может проистекать? Здесь я присоединяю коды различных классов, которые учреждают упражнение.

       public class EstadoNave implements VirtualVertex<EstadoNave, SimpleEdge<EstadoNave>> { 
  //CÓDIGO ESTADO NAVE
static List<ObjetoHangar> hangar;
private List<ObjetoHangar> armas_seleccionadas;
private int arma_i;
private List<String> requisitos; //lista de requisitos en el momento


public EstadoNave() {
    //TODO
    armas_seleccionadas= new ArrayList<ObjetoHangar>();
    arma_i=0;
    requisitos=new ArrayList<String>();
}

public EstadoNave(List<ObjetoHangar> armas_seleccionadas, int arma_i, List<String>requisitos) {
    // TODO
    super();
    this.armas_seleccionadas=armas_seleccionadas;
    this.arma_i=arma_i; 
    this.requisitos=requisitos;


}
public List<ObjetoHangar> getArmasSeleccionadas(){
    return armas_seleccionadas;
}

@Override
public boolean isValid() {
    // TODO
    return true;
}

@Override
public Set<EstadoNave> getNeighborListOf() {
    Set<EstadoNave> ret = Sets.newHashSet();

    // TODO
    if(arma_i<hangar.size()){
        EstadoNave es= new EstadoNave(armas_seleccionadas, arma_i+1, requisitos);
        es.armas_seleccionadas.add(hangar.get(arma_i));
        ret.add(es);
        EstadoNave esn= new EstadoNave(armas_seleccionadas, arma_i+1, requisitos);
        ret.add(esn);
    }

    return ret;
}

@Override
public Set<SimpleEdge<EstadoNave>> edgesOf() {
    // TODO
    Set<EstadoNave>vecinos= getNeighborListOf();
    Set<SimpleEdge<EstadoNave>> ret= new HashSet<>();
    for(EstadoNave vecino:vecinos){
        SimpleEdge<EstadoNave> arista=SimpleEdge.<EstadoNave>create(this, vecino);
        ret.add(arista);
    }
    return ret;


}

@Override
public boolean isNeighbor(EstadoNave e) {
    // TODO
    return getNeighborListOf().contains(e);
}

public Integer getDistancia(EstadoNave e){ 
    List<ObjetoHangar> armasprobables= new ArrayList<ObjetoHangar>();
    int i;
    int j;
    for(i=0;i<armasprobables.size();i++){
        ObjetoHangar arma_analizada=armasprobables.get(i);
        for(j=0;i<arma_analizada.getCaracteristicas().size();j++){
            if(requisitos.contains(arma_analizada.getCaracteristicas().get(j))){
                armasprobables.add(arma_analizada);
            }

        }
    }
    //coger mínimo de armasprobables. De todas las armas que he guardado tengo que escoger la que pese menos
    return int)armasprobables.stream().filter(x->x.getPeso()!=null).mapToDouble(x->x.getPeso()).min().orElse(0);

}
@Override
public String toString() {
    return "EstadoNave [armas_seleccionadas=" + armas_seleccionadas + ", arma_i=" + arma_i + "]";
}


          public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + arma_i;
    result = prime * result + ((armas_seleccionadas == null) ? 0 : armas_seleccionadas.hashCode());
    result = prime * result + ((requisitos == null) ? 0 : requisitos.hashCode());
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    EstadoNave other = (EstadoNave) obj;
    if (arma_i != other.arma_i)
        return false;
    if (armas_seleccionadas == null) {
        if (other.armas_seleccionadas != null)
            return false;
    } else if (!armas_seleccionadas.equals(other.armas_seleccionadas))
        return false;
    if (requisitos == null) {
        if (other.requisitos != null)
            return false;
    } else if (!requisitos.equals(other.requisitos))
        return false;
    return true;
}

     }

////GRAFONAVE

    public class GrafoNave extends UndirectedSimpleVirtualGraph<EstadoNave, SimpleEdge<EstadoNave>>
    implements AStarGraph<EstadoNave, SimpleEdge<EstadoNave>> {

public static GrafoNave create(EdgeFactory<EstadoNave,SimpleEdge<EstadoNave>> edgeFactory){
    return new GrafoNave(edgeFactory);
}

public GrafoNave(EdgeFactory<EstadoNave, SimpleEdge<EstadoNave>> edgeFactory) {
    super(edgeFactory);
}

@Override
public double getEdgeWeight(SimpleEdge<EstadoNave> e) {
    // TODO 
    return 0;

}

@Override
public double getVertexWeight(EstadoNave vertex) {//tengo que ir recorriendo las armas de la lista de armas_seleccionadas
    //y devolver la suma de los pesos
    // TODO
    double sumapesos = 0;
    int i;
    for(i=0;i<vertex.getArmasSeleccionadas().size();i++){
        sumapesos=vertex.getArmasSeleccionadas().get(i).getPeso();
    }

    return sumapesos;
}

@Override
public double getVertexWeight(EstadoNave vertex, SimpleEdge<EstadoNave> edgeIn, SimpleEdge<EstadoNave> edgeOut) {
    // TODO
    return 0;
}


@Override
public double getWeightToEnd(EstadoNave actual, EstadoNave endVertex, Function<EstadoNave, Double> goalDistance,
        Set<EstadoNave> goalSet) {
    // TODO

        if (actual == null || endVertex == null)

            //revisar este método

            throw new IllegalArgumentException("El vértice actual y final no pueden ser null");


        // TODO
        double r=actual.getDistancia(endVertex);
        return r;
}

   }

////OBJETOHANGAR

    public class ObjetoHangar implements Comparable<ObjetoHangar>{

String nombre;
List<String> caracteristicas;
private Float danyo;
private Float peso;

public ObjetoHangar(String id, List<String> caracteristicas, Float peso, Float danyo) {
    this.nombre = id;
    this.caracteristicas = caracteristicas;
    this.peso = peso;
    this.danyo = danyo;

}

public ObjetoHangar(String id, List<String> caracteristicas, Float peso) {
    this.nombre = id;
    this.caracteristicas = caracteristicas;
    this.peso = peso;
    this.danyo = 0f;

}

public String getNombre(){
    return nombre;
}

public Float getDanyo() {
    return danyo;
}
public List<String> getCaracteristicas(){
    return caracteristicas;
}

public void setDanyo(Float danyo) {
    this.danyo = danyo;
}

public Float getPeso() {
    return peso;
}

public void setPeso(Float peso) {
    this.peso = peso;
}

public String toString() {
    return "Arma [id=" + nombre + ", peso=" + peso + ", daño=" + danyo + "]";
}





@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((caracteristicas == null) ? 0 : caracteristicas.hashCode());
    result = prime * result + ((danyo == null) ? 0 : danyo.hashCode());
    result = prime * result + ((nombre == null) ? 0 : nombre.hashCode());
    result = prime * result + ((peso == null) ? 0 : peso.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (!(obj instanceof ObjetoHangar))
        return false;
    ObjetoHangar other = (ObjetoHangar) obj;
    if (caracteristicas == null) {
        if (other.caracteristicas != null)
            return false;
    } else if (!caracteristicas.equals(other.caracteristicas))
        return false;
    if (danyo == null) {
        if (other.danyo != null)
            return false;
    } else if (!danyo.equals(other.danyo))
        return false;
    if (nombre == null) {
        if (other.nombre != null)
            return false;
    } else if (!nombre.equals(other.nombre))
        return false;
    if (peso == null) {
        if (other.peso != null)
            return false;
    } else if (!peso.equals(other.peso))
        return false;
    return true;
}

@Override
public int compareTo(ObjetoHangar o) {
    int res = 0;

    if(this.getPeso() > o.getPeso()){
        res = 1;
    } else{
        res = -1;
    }

    return res;
}





       }

///CLASETEST

           public class TestViajeInterestelar {


public static void main(String[] args) {

    // TODO: Inicializa el problema hangar y requisitos
    //A) REQUISITOS
    List<String> requisitos= Lists.newArrayList("Laser", "Ligera", "Paralizante",
            "Cuerpo-Cuerpo");
    //B)HANGAR
    List<ObjetoHangar> hangar= new ArrayList<ObjetoHangar>();
    ObjetoHangar arma1= new ObjetoHangar("P-90", Lists.newArrayList("Laser", "Ligera"), 150f, 750f);
    ObjetoHangar arma2= new ObjetoHangar("P-90", Lists.newArrayList("Laser", "Ligera"), 250f, 650f);
    ObjetoHangar arma3= new ObjetoHangar("Disruptor kull", Lists.newArrayList("Paralizante", "Ligera"),
            250f, 500f);
    ObjetoHangar arma4= new ObjetoHangar("Zat", Lists.newArrayList("Laser", "Paralizante", "Cuerpo-Cuerpo"),220f,350f);
    hangar.add(arma1);
    hangar.add(arma2);
    hangar.add(arma3);
    hangar.add(arma4);
    // TODO: Crear estado inicial vacio
    EstadoNave pInicial= new EstadoNave();


    // TODO: Generar function
    Function<EstadoNave, Double> function = (e -> {
        if (requisitos.stream().allMatch(req ->
         e.getArmasSeleccionadas().stream().anyMatch(arma ->
         arma.caracteristicas.contains(req)))) {
        return 0.0;
        } else {
        return Double.MAX_VALUE; //aquí también tengo que revisar
        }
        });

    System.out.println(pInicial);
   // System.out.println(function);

    // TODO: Crear grafo AStart
    AStarGraph<EstadoNave,SimpleEdge<EstadoNave>> graph = new GrafoNave(null);

    // TODO: Crear Algoritmo AStar y le pasamos el grafo, el estado inicial
    // y el function
    AStarAlgorithm<EstadoNave,SimpleEdge<EstadoNave>> alg = Algoritmos.createAStar(graph, pInicial, function);

    if (alg.getPath() == null) {
        System.out.println("No se encuentra solución");
    } else {
        System.out.println(
                "Danyo: " + alg.getPathLength() + ":" + alg.getPath().getEndVertex().getArmasSeleccionadas());
    }
}

     } 

Случается, выполнив код следующее исключение:

introducir la descripción de la imagen aquí

1
задан 07.01.2017, 22:11
0 ответов

Ты ослепляешь твою собственную ошибку. Протестируй это:

Изменись в GrafoNave:

@Override
public double getWeightToEnd(EstadoNave actual, EstadoNave endVertex,
       Function<EstadoNave, Double> goalDistance,
       Set<EstadoNave> goalSet) {
       double r;
       try{
           // TODO

           /**
           if (actual == null || endVertex == null)

           //revisar este método

           throw new IllegalArgumentException("El vértice actual y final no pueden ser null");
           **/

           // TODO
           double r=actual.getDistancia(endVertex);
       } catch (Exception e) {
           e.printStackTrace();
       }
       return r;

}

В консоли ты будешь видеть, откуда приходит твой объект null.

Обычно он рекомендуемый не ловления и ослепления ошибок в java уже прежде чем они происходят.

Сейчас, когда у нас есть исключение мы можем анализировать это, чтобы находить проблему делай конкретным. В этом случае это не было самое общее (NullPointerException), но NoSuchElementException, которая бросает класс OptionalDouble Java8.

Проверяя API класса, в getAsDouble () бросается это исключение в случае, что OptionalDouble ничего не содержит.

Также он объясняется, что OptionalDouble "может, или не содержать стоимость типа double".

Я не работал много с новыми Стреам де Кольектион в Java8, так он не мог бы давать тебе хорошую идею, где твой метод не удается точно, но я могу давать тебе решения, как то, чтобы переходить, чтобы решать тему.

Проверь в EstadoNave метод getDistancia (...):

public Integer getDistancia(EstadoNave e){ 
    List<ObjetoHangar> armasprobables= new ArrayList<ObjetoHangar>();
    int i;
    int j;
    for(i=0;i<armasprobables.size();i++){
        ObjetoHangar arma_analizada=armasprobables.get(i);
        for(j=0;i<arma_analizada.getCaracteristicas().size();j++){
             if(requisitos.contains(arma_analizada.getCaracteristicas().get(j))){
            armasprobables.add(arma_analizada);
            }

        }
    }
    //coger mínimo de armasprobables. De todas las armas que he guardado tengo que escoger la que pese menos
    // no se recomienda de no programar en código espagueti, menos si aparecen errores 
    // -- return (int) armasprobables.stream().mapToDouble(x->x.getPeso()).min().getAsDouble();
    Stream<ObjetoHangar> aps = armasprobables.stream();
    DoubleStream ds = aps.mapToDouble(x->x.getPeso());
    OptionalDouble od = ds.min();
    // Ten en cuenta que un cast de double a int no siempre resulta porque double puede ser más grande que un int puede contener
    if (od.isPresent()) return (int) od.getAsDouble();

    // no había mínimo del DoubleStream, aquí puedes analizar lo que no funcionó
    System.out.println(String.format("List len %d, ds elementos %d",
                         armasproblables.length(), ds.count())); 

    // agrega más informaciónes hasta encontrar el error
}
2
ответ дан 03.12.2019, 17:51
  • 1
    Я изменил có я говорю продолжая Ваши инструкции, и правда состоит в том, что к несчастью у меня не заканчивает оставаться ясным cuá l - ошибка, что está производя. Добавление задержание участвовало в рыцарском турнире под có я говорю –  06.01.2017, 23:45
  • 2
    Твоя проблема состоит в том, что OptionalDouble бросает excepció n, потому что Stream , которых ты создаешь, он не возвращает double с min () . Deberí схвати повторно выписывать счет-фактуру на следующего có я говорю, чтобы видеть, где твои данные не то, что ты ждешь: return (int) armasprobables.stream () .mapToDouble (x-> x.getPeso ()) .min () .getAsDouble (); –  07.01.2017, 01:50
  • 3
    Не sé очень хорошо có mo deberí чтобы изменять этот return. В этом моменте, ¿ qué возврати точно, если это не double? ¿ Qué deberí чтобы делать для того, чтобы mé все возвращало тип Float, так как я стремлюсь к тому, чтобы возвратить вес оружия, которое весит меньше? –  07.01.2017, 17:34
  • 4
    @Montu, я буду издавать тебе ответ со ссылками, в котором ты нуждаешься, чтобы исследовать твою проблему пока. Для будущего я рекомендую тебе привыкать чтения documentació n их _API_s, который ты используешь. Все то, что ты нуждался бы в том, чтобы узнать, находится там. –  07.01.2017, 19:17
  • 5
    ¡ Большое спасибо! –  07.01.2017, 19:38