JAVA RMI dispatchUncaughtException - Проблема приведения интерфейса - PullRequest
0 голосов
/ 06 февраля 2010

Для школы мы создали приложение Java с RMI, есть 3 приложения: Сервер, Клиент и Rekenaar.

Строка, в которой происходит ошибка, является строкой: "test = (Range []) m.getAllRange ();" , выдает dispatchUncaughtException.

package rekenaar;

import server.Opdracht;
import java.rmi.Naming;
import java.util.logging.Level;
import java.util.logging.Logger;
import interfaces.*;
import java.rmi.RemoteException;

/**
 *
 * @author Windows
 */
public class Rekenaar implements Runnable{

    private Range range;
    private IRekenCoördinator coordinator;
    private long[] priemgetallen;
    private Opdracht op;
    private Range[] test;

    public Rekenaar()
    {
        try{
        this.coordinator = null;
        this.coordinator = (IRekenCoördinator) Naming.lookup("rmi://127.0.0.1:1099/RekenC");
        this.priemgetallen = coordinator.getPriemgetallen();
        this.op = null;
        }catch(Exception ex){ex.printStackTrace();}

    }


    public void Bereken() 
    {
        try{
        long rangeOndergrens = (op.getGetal()/2000) * 2000;
        range = new Range(priemgetallen, rangeOndergrens);
        op.setRange(range);
        op.setUitkomst(range.geefSemiPriem(op.getGetal()));
        coordinator.RemoveID(op.CheckRange());

        IMagazijn m = op.getMagazijn();
        test = (Range[])m.getAllRange();
        String hoi = m.hoi();


        m.AddRange(op);
        }catch(RemoteException ex){ex.printStackTrace();}
    }


    @Override
    public void run() {
                KrijgtOpdracht();
    }

    private void KrijgtOpdracht() 
    {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ex) {
            Logger.getLogger(Rekenaar.class.getName()).log(Level.SEVERE, null, ex);
        }
        if(coordinator != null)
        {
            try{
        op = (Opdracht)coordinator.getOpdracht();
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
        if(op != null ) this.Bereken();

        this.run();

        }
    }

}

Интерфейс:

package interfaces;

import java.io.IOException;
import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 *
 * @author Windows
 */
public interface IMagazijn extends Remote {

    /**
     *
     * @param op        Uitgerekende opdracht waarvan de gegevens verwerkt moeten worden op de server
     * @throws IOException
     */
    public String hoi() throws RemoteException;
    public IRange[] getAllRange() throws RemoteException;
    public void AddRange(IOpdracht op) throws RemoteException;

}

А вот сам Magazijn, который дает IRange над RMI:

package server;


import java.rmi.RemoteException;
import java.util.ArrayList;

import interfaces.*;
import java.rmi.server.UnicastRemoteObject;



public class Magazijn extends UnicastRemoteObject implements IMagazijn{

private IRange[] ranges;
private long ondergrens;

public void setOndergrens(long ondergrens) {
    this.ondergrens = ondergrens;
}
private long bovengrens;

public void setBovengrens(long bovengrens) {
    this.bovengrens = bovengrens;
}
private transient MagazijnManager MM;
private transient ArrayList<Opdracht> dubbeleOpdrachten;
private transient RekenCoördinator RC;
private transient int MAGAZIJN_GROOTTE;

public Magazijn(long ondergrens, long bovengrens, MagazijnManager mm, RekenCoördinator RC)throws RemoteException
{
    ranges = new IRange[(int)(bovengrens-ondergrens)/2000];
    this.bovengrens = bovengrens;
    this.ondergrens = ondergrens;
    dubbeleOpdrachten = new ArrayList<Opdracht>();
    this.MM = mm;
    this.RC = RC;
    MAGAZIJN_GROOTTE = (int)(bovengrens - ondergrens) + 1;
}

public void AddRange(IOpdracht op) throws RemoteException
{
    ArrayList<IOpdracht> returnList = new ArrayList<IOpdracht>();
    ranges[op.getRangeIndex()] = op.getRange();
    returnList.add(op);
    for(Opdracht o : dubbeleOpdrachten)
    {
        if(o.getRangeIndex() == op.getRangeIndex())
        {
            o.setRange(op.getRange());
            o.setUitkomst(o.getRange().geefSemiPriem(o.getGetal()));
            returnList.add(o);
        }
    }
    MM.StuurOpdrachtenTerug(returnList);
}

public IRange[] getAllRange() throws RemoteException
{
    return ranges;
}

 public String hoi() throws RemoteException
{
    return "poep";
}

public IRange getRange(int rangeIndex)
{
    return ranges[rangeIndex];
}

public void StuurOpdracht(Opdracht op)
{
    Opdracht o =null;
        o = RC.AddOpdracht(op);
    if(o!=null)
    {
        dubbeleOpdrachten.add(o);
    }
}

public long getOndergrens()
{
    return ondergrens;
}

 public long getBovengrens()
{
    return bovengrens;
}

 public int getMagazijnGrootte()
 {
     return MAGAZIJN_GROOTTE;
 }

}

Rekenaar получил целый класс "Range", так что это не проблема. Проблема в чем-то между приведением IRange в Range. Сам диапазон является Сериализуемым и реализует IRange.

Ошибка, которую я получаю: Исключение в потоке "main" java.lang.ClassCastException: [Linterfaces.IRange; не может быть брошен на [Lrekenaar.Range;

1 Ответ

2 голосов
/ 06 февраля 2010

При использовании RMI вы не получите те же реализации, что и на стороне сервера. Вместо этого вы получаете прокси-класс, который будет вызывать ваш сервер. Таким образом, вы не можете использовать свой метод. Изменить тест на

IRange[] test

Это должно сделать это.

...