コンストラクタのエラーに対する解決方法

このQ&Aのポイント
  • Interfaceを実装して、コンストラクタのエラーに対する解決方法を説明します。
  • Tempクラスのコンストラクタで発生するエラーを解決する方法を探しています。
  • インターフェースの中に必要な行を追加したが、エラーが解決されませんでした。どう対応すべきでしょうか?
回答を見る
  • ベストアンサー

Interfaceを実装して、コンストラクタのエラー

もともと Tempクラスで public void a() public String b() という2つのメソッドと、 public Temp(String s) という一つのコンストラクタを持っていて、 public interface Tempinterface extends Remote { public void a() throws RemoteException; public String b() throws RemoteException; } という中身のインターフェースを作り、 Tempクラスの一行目を public class Temp extends UnicastRemoteObject implements Tempinterface に変更しました。 今コンパイルの時点で、 public Temp(String s) のコンストラクタで 「unreported exception: java.rmi.RemoteException; must be caught or declared to be thrown」 というエラーが出ています。 インターフェースの中に public Temp(String s) throws RemoteException; という一行を加えたらメソッドじゃないから駄目、 と言われて、 Tempクラスのコンストラクタの中で try、catchしてみたらそんなExceptionは出ない、 と言われて困っています。 これはどうすればいいのでしょうか?

  • fuyu
  • お礼率69% (145/210)
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • akr
  • ベストアンサー率18% (32/173)
回答No.1

TempのコンストラクタにRemoteExceptionをスローするようにしたら、コンパイル出来るんじゃないですか TempクラスのスーパークラスであるUnicastRemoteObjectクラスのコンストラクタが全て、RemoteExceptionをスローしてるんで、その継承したTempのも必要なのでは

fuyu
質問者

お礼

おっしゃる通り、コンストラクタにRemoteExceptionをスローするようにしたら、無事に解決いたしました。 ありがとうございました。

関連するQ&A

  • JavaのRMIで!!

    クライアントから呼び出してサーバーでhogehogeを表示させるようにこんなプログラムを書きました。 command.javaが以下の内容 import java.rmi.*; interface command extends Remote{ void comcom() throws RemoteException; } commandclient.javaが以下の内容 import java.rmi.*; public class commandclient { public static void main(String args[]) { command obj = null; try { System.setSecurityManager(new RMISecurityManager()); obj = (command)Naming.lookup("rmi://localhost/MyObject"); obj.comcom(); } catch(Exception e) { e.printStackTrace(); } } } commandserver.javaが以下の内容 import java.rmi.*; import java.rmi.server.*; public class commandserver extends UnicastRemoteObject implements command { public static void main(String args[]) { if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } try { commandserver obj = new commandserver(); Naming.rebind("MyObject", obj); } catch (Exception e) { e.printStackTrace(); } } public commandserver() throws RemoteException { } public void comcom() throws RemoteException { System.out.println("hogehoge"); } } こんなプログラムを書いてコンパイルして実行したらhogehogeが表示されるかな?と思ったら実効するとなんか意味不明なエラーがでます。これはなぜでしょうか?

  • 「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」

    「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」は正しい? はじめまして。Javaのインタフェースに関する質問です。 私はこれまで、インタフェースを使うときは、インタフェースを実装してクラスを宣言し、そのクラス、またはサブクラスでインタフェースがもつすべての抽象メソッドを定義する、と理解していました。 しかし、下の例をみてください。抽象メソッドの定義を、インタフェースの実装の以前で与えています。問題無くコンパイルでき、実行できます。実行結果も以下の通りです。 インタフェースの抽象メソッドへの定義の与え方やその実行のされ方は、メソッドのオーバーライドと同様と思っていましたので、下記のコードでは「クラスBが抽象クラスではありません」や、「インタフェースの抽象メソッドがオーバーライドされていません」などの文法エラーがでると思っていました。 そこで、質問です。 インタフェースが持つ抽象メソッドの定義を与える場所について、または、これに関する説明のあるページなど、何かご存知でしたら教えてください。 ★コード★ interface X{   void show(); } class A{   public void show(){     System.out.println("A");   } } class B extends A implements X{ } public class Main{   public static void main(String[] args){     X x=new B();     x.show();   } } ★実行結果★ >java Main A ★Java環境★ java 1.6.0_21 javac 1.6.0_16

    • ベストアンサー
    • Java
  • コンストラクタ,interface,abstractの呼び出し順について

    現在、java初心者入門などの本で勉強しております 下記についてご教授お願い致します コンストラクタ、interface、abstractの呼び出し順について質問なのですが、 下記プログラムを実行したところ(同一のパッケージ内に明記) // インターフェイス public interface interFaceClassSS {    public void show(); } public interface interFaceClassS {    public void show(); } // 抽象クラス public abstract class ClassSSSab {    // 共通のメソッドを実装    //個々のメソッド    abstract void show(); } // スーパークラス public class ClassSSS extends ClassSSSab{    public ClassSSS(){       System.out.println("ClassSSS");       show();    }    public void show(){       System.out.println("ClassSSSabの抽象メソッドを実装");    } } public class ClassSS extends ClassSSS implements interFaceClassSS {    public ClassSS() {       System.out.println("ClassSS");       show();    }    public void show() {       System.out.println("interFaceClassSSを実装");    } } // メイン処理 public class ClassS extends ClassSS implements interFaceClassS {    public ClassS() {       System.out.println("ClassS");       show();    }    public static void main(String[] args) {       new ClassSSS();       System.out.println("");       new ClassSS();       System.out.println("");       new ClassS();    }    public void show() {    System.out.println("interFaceClassSを実装");    } } // 結果 ClassSSS ClassSSSabの抽象メソッドを実装 ClassSSS interFaceClassSSを実装 ClassSS interFaceClassSSを実装 ClassSSS interFaceClassSを実装 ClassSS interFaceClassSを実装 ClassS interFaceClassSを実装 の結果となりました。 当方が望む結果は、 ClassSSS ClassSSSabの抽象メソッドを実装 ClassSSS ClassSSSabの抽象メソッドを実装 ClassSS interFaceClassSSを実装 ClassSSS ClassSSSabの抽象メソッドを実装 ClassSS interFaceClassSSを実装 ClassS interFaceClassSを実装 上記となります。 new ClassSSSの処理は当方が望む結果なのですが、 new ClassSSでは、 newClassSSSの結果に ClassSS interFaceClassSS が追加されると理解していたのですが、結果は、 違っておりました。 どこに誤りがあるのが、数日検討したのですが、分からない状態です。 ご教授の程お願い致します。

    • ベストアンサー
    • Java
  • [RMI]UnicastRemoteObject.exportObjectで毎回例外が出る

    RMIサーバ/クライアントを実験しているのですが、JDK5.0にて http://72.5.124.55/j2se/1.5.0/ja/docs/ja/guide/rmi/socketfactory/index.html や http://d.hatena.ne.jp/nowokay/20060112 にあるように、 (1)リモートオブジェクトを new (2)UnicastRemoteObject.exportObject() (3)LocateRegistry.createRegistry() (4)(3)で起動した rmiregistry に bind しようとしたのですが、(3)(4)にたどり着くまでもなく、 (2)で必ず例外(ExportException: object already exported)が出てしまいます。 具体的には以下のようなコードが私の環境では例外になってしまいます。 (便宜上内部クラスとして記述し直しています。また空白を全角にしています) =================================================================== package test; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; public class Server {   public static void main(String[] args) throws Exception {     Server server = new Server();     server.init();   }   public void init() throws Exception {     Foo rmiObj = new FooImpl();     Foo stub = (Foo) UnicastRemoteObject.exportObject(rmiObj, 41199); //★ここで例外     LocateRegistry.createRegistry(1099);     Registry registry = LocateRegistry.getRegistry(1099);     registry.rebind("fooService", stub);   }   /* リモートインターフェース */   public interface Foo extends Remote {     public void hello() throws RemoteException;   }   public class FooImpl extends UnicastRemoteObject implements Foo {     public FooImpl() throws RemoteException {}     public void hello() throws RemoteException {       System.out.println("Hello World.");     }   } } =============================================================== ★例外 Exception in thread "main" java.rmi.server.ExportException: object already exported at sun.rmi.transport.ObjectTable.putTarget(ObjectTable.java:172) at sun.rmi.transport.Transport.exportObject(Transport.java:75) at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:196) at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:382) at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:116) at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:180) at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:293) at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:235) at test.Server.init(Server.java:18) at test.Server.main(Server.java:13) =============================================================== init の2行目、つまり実質 new して exportObject しようと するだけで例外になってしまうので、原因がよく分かりません。 他プロセスに起動したものが残っていたりしないか確認しましたが、 特に見受けられませんでした。 実はそのまさに2行目を抜いた状態で RMI サーバを起動しておき、 リモートオブジェクトを取ると…うまく取れてしまいました。 (ただし RMI サーバ/クライアントはともに同じローカル) が、上で挙げた情報先にあるような書き方でできないのがどうにも 気持ち悪いのです。 どこが悪いのでしょうか…

  • Javaのコンストラクタについて教えてください

    Javaを勉強している初心者です。 次のようなプログラムがあります。 このプログラムでclass aおよびclass bのデフォルトコンストラクタ a() {}とb() {}をコーディングしていないとコンパイルエラーになります。 b() {}についてはclass bのパラメータのあるコンストラクタb(String s)がサブクラスclass cから明示的に呼ばれていないのでデフォルトコンストラクタb() {}をコーディングしないとエラーになる…と考えればよいのでしょうか。 それでは、a() {}はなぜ必要なのでしょうか。 どなたか教えてください。 class a { a() {} a(String s) { System.out.println("In a's constructor..."); System.out.println(s); } } class b extends a { b() {} b(String s) { super(s); System.out.println("In b's constructor..."); System.out.println(s); } } class c extends b { c(String s) { System.out.println("In c's constructor..."); System.out.println(s); } public void some() { System.out.println("something..."); } } public class appJ01 { public static void main(String args[]) { c obj = new c("Hello from Java!"); } } 

  • インターフェイス実装クラスの表示について

    /* インタフェースPlanetを実装したクラスEarth、Marsがあります。  以下の実行結果になるようにクラスAggregateへshowメソッドを  追加してください。 [実行結果] 地球 太陽系にある惑星の1つで、太陽から3番目に近い。・・・ 火星 太陽系の太陽に近い方から4番目の惑星である。・・・ */ // [Planet.java] // 実装したいPlanetクラス interface Planet {   public String getName();   public String getOutline(); } // Planetを実装したEarthクラス // [Earth.java] class Earth implements Planet {   private final String name="地球";   // getNameメソッド:戻り値String、引数無し   public String getName(){    return name;   }   // getOutlineメソッド:戻り値String、引数無し    public String getOutline(){      return "太陽系にある惑星の1つで、太陽から3番目に近い。・・・";    } } // Planetを実装したMarsクラス // [Mars.java] class Mars implements Planet {   private final String name="火星";   // getNameメソッド:戻り値String、引数無し   public String getName(){     return name;   }   // getOutlineメソッド:戻り値String、引数無し   public String getOutline(){     return "太陽系の太陽に近い方から4番目の惑星である。・・・";   } } // メインクラス // [Main.java] class Main{   public static void main(String[] args){   // Earth&Marsクラスのインスタンス化    Earth earth = new Earth();     Mars mars = new Mars();   // Aggregateクラスのインスタンス化   Aggregate aggregation = new Aggregate();   // showメソッド呼び出し:戻り値無し、引数earth・mars    aggregation.show(earth);    aggregation.show(mars); } } // [Aggregate.java] class Aggregate { // ここにshowメソッドを追加   public void show(Earth planet){     System.out.println();   }   public void show(Mars planet){     System.out.println();   }  } showメソッドに引数としてEarth planet,Mars planetを渡すというところまでは理解しています。後は星の名前と概要を表示するのですが、例えば、 showメソッド内 // ここにshowメソッドを追加 public void show(Earth planet){ String str = earth.getName(); System.out.println(str); } public void show(Mars planet){ String str2 = mars.getOutline(); System.out.println(str2); } } とすると、erathとmarsの部分が「シンボルがありません」のエラーになります。自分の認識としては、EarthクラスとMarsクラスでフィールド変数を宣言しているので使えるのでは?と思っていたのですが、全然違うようです。どなたかどちらかのコード例を表記して頂けないでしょうか?よろしくお願い致します。

    • ベストアンサー
    • Java
  • 継承・実装の関係で悩んでいます。

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。 // 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない) クラスAからクラスBでオーバーライドしたメソッドは、 クラスCでさらにオーバーライドできるのでしょうか? クラスCが クラスBのクラスAからオーバーライドしたメソッド をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか? クラスA │ インスタンスフィールドA │ staticフィールドA │ │ クラスA() { } │ │ インスタンスメソッドA () { } │ staticメソッドB() { } ↓ クラスB extends クラスA │ インスタンスフィールドA // 継承 │ インスタンスフィールドB │ staticフィールドB │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ インスタンスメソッドA () { } // 継承 │ │ インスタンスメソッドB () { } │ staticメソッドB () { } ↓ クラスC extends クラスB implements インタフェースD, ... ↑ インスタンスフィールドA // クラスBのフィールドを継承 │ インスタンスフィールドB // クラスBのフィールドを継承 │ インスタンスフィールドC │ staticフィールドC │ │ サブクラス2() { } │ │ インスタンスメソッドA () { } // クラスBのメソッドを継承 │ インスタンスメソッドB () { } // クラスBのメソッドを継承 │ インスタンスメソッドD () { } // インタフェースDのメソッドを実装 │ インスタンスメソッドE () { } // インタフェースDのメソッドを実装 │ │ │ インスタンスメソッドC () { } │ staticメソッドC() { } │ interface インタフェースD extends インタフェースE ↑ │ staticフィールドD // public static final │ │ インスタンスメソッドD() { } // public abstract │ インスタンスメソッドE() { } // 継承 │ interface インタフェースE staticフィールドE // public static final インスタンスメソッドE() { } // public abstract

    • ベストアンサー
    • Java
  • リスナーを別クラスで書いた時のエラーの意味と原因?

       今晩は。  参考書を見ながら、リスナーを別クラスで書いてみました。  maクラスのコンストラクタを「public void ma」にすると「maのコンストラクタが未定義」 ですというエラーが出ます。  これはどのような意味でしょうか、よろしくお願いします。 ================================================================================= public class applet extends Applet { String s = "Hello" ; public void init() { addMouseListener(new ma(this)); } public void paint(Graphics g) { g.drawString( s , 60 , 60 ) ; } } class ma extends MouseAdapter { applet a ; public /*void*/ ma(applet ap) { a = ap ; } public void mouseClicked(MouseEvent e) { a.s = "JAVA" ; a.repaint() ; } }

    • ベストアンサー
    • Java
  • java コンパイルエラー

    java コンパイルエラー java 初心者です。 簡単なプログラムを作りながら練習していたのですが、Exceptionクラスを継承して新しい例外を作る以下のプログラムで、コンパイルエラーとなり、解決できません。 class NewException extends Exception{ public NewException(){ super("エラー"); } } これを javac でコンパイルすると、 NewException.java:3: シンボルを見つけられません。 シンボル: コンストラクタ Exception(java.lang.String) 場所  : Exception の クラス super("エラー"); ^ エラー1個 と言われます。 これを読むと「Exception には String を引数にとるコンストラクタはないよ」と言われているように思えるのですが、そんなはずないのでは。。 もし原因がお分かりの方がいらしたら、ご教示いただけるとありがたいです。

    • ベストアンサー
    • Java
  • コンストラクタがコンパイラに理解されない

    簡単にいうと class A extends AA{ public A(Event_a a,MySession s){   super(); try{略}cacth{略} } public A(Event_b b,MySession s){  super(); try{略}cacth{略} }  //メソッド略 } という二つのコンストラクタを持ったクラスです。 コンパイル時に、「シンボル:コンストラクタ A(Event_b b,MySession s)を理解でいません」といわれてしまいます。どちらのコンストラクタも同じように使用しています。なのに、Event_aは何も言われずに、Event_bだけが理解できないと言われてしまうのは何故でしょう?訳が分かりません。何度もソースを見直しました。呼び出し元のクラスの引数も間違っていません。クラスAにはちゃんと二つのコンストラクタを用意しています。 このような体験がおありでしたら、是非教えてください。よろしくお願いいたします。

専門家に質問してみよう