JAVA RMIdispatchUncaughtException - 接口转换问题

发布于 2024-08-20 15:39:38 字数 4977 浏览 2 评论 0原文

对于学校,我们使用 RMI 制作了一个 Java 应用程序,有 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 本身,它通过 RMI 提供 IRange:

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 之间的问题。 Range 本身是可序列化的并实现了 IRange。

我得到的错误:线程“main”java.lang.ClassCastException中的异常:[Linterfaces.IRange;无法投射到 [Lrekenaar.Range;

For school we made a Java application with RMI, there are 3 applications: Server, Client and Rekenaar.

The line where it goes wrong is the Line: "test = (Range[])m.getAllRange();", it gives an 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();

        }
    }

}

Interface:

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;

}

And here is the Magazijn itself which gives the IRange over 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;
 }

}

The Rekenaar got the whole class "Range" so that is not the problem. The problem is something between the casting of IRange into Range. Range itself is Serializable and implements IRange.

The error I get: Exception in thread "main" java.lang.ClassCastException: [Linterfaces.IRange; cannot be cast to [Lrekenaar.Range;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

作业与我同在 2024-08-27 15:39:38

使用 RMI 时,您不会收到与服务器端相同的实现。相反,您会得到一个代理类,它将调用您的服务器。所以你不能投射你的方法。
将测试更改为

IRange[] test

应该可以。

When using RMI, you won't receive the same implementations you have on the server side. Instead you get a proxy class which will call your server. So you cannot cast your method.
Change test to a

IRange[] test

That should do it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文