• ベストアンサー

Javaプログラミング

こんにちは。Javaを最近勉強し始めたJava初心者です。これは2つの数を入力してそれそれの和、差、積、剰余を表示するものです(入力時の妥当性チェックは考慮しない。)。しかし下記のプログラムがうまく動いてくれません。どこが間違っているのかわからないのでわかる方教えて下さい。おねがいします。 import java.io.*; interface plus { int Plus(); } interface sub { int Sub(); } interface mul { int mul(); } interface mod { int Mod(); } class Compute extends plus,sub,mul,mod { int pa,pb; Compute(int a,int b) { this.pa=a; pb=b; } public int Plus() { return(pa+pb); //和を返す } public int Sub() //差を返す { return(pa-pb); } public int Mul() { return(pa*pb); //積を返す } public int Mod() { return(pa%pb); //余を返す } } class calc { public static void main(String args[]) throws IOException { InputStreamReader isp=new InputStreamReader(System.stdin); BufferedReader inp=new BufferedReader(isp); System.out.print("数1="); String sLins=inp.readLine(); //1つめの数値を入力 int a=integer.parseInt(sLine); System.out.print("数2="); String sLins=inp.readLine(); //2つめの数値を入力 int b=integer.parseInt(sLine); Compute c=new Compute(a,b); System.out.println("和:"+c.Plus()+"差:"+c.Sub()+"積:"+c.Mul()+"余:"+c.Mod()); } }

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

  • ベストアンサー
  • jo-ji
  • ベストアンサー率72% (26/36)
回答No.2

まず、もう少し質問上手にならないと、何事においても損をしますよ。 「うまく動いてくれません」とだけ書いてソースファイルを付けるのは、状況説明があまりに不足しています。 最初この質問を見た時には、コンパイルは成功したけど思った通りに動かないという意味かと思ったのですが、ソースファイルがこのままだとしたらコンパイルは失敗してますよね。 コンパイルに失敗したとしたらどういうエラーが出たのか、載せるべきだったと思います。コンパイラのエラーメッセージから間違いを見つけるように頑張らないと、これから毎回誰かにチェックしてもらわないといけなくなります。「初心者」とは言っていますが、たとえばスペルミスは注意深く確認すれば解決できますよね。 とりあえず、見つかった間違いは以下のとおりです。スペースが無視されて読みにくくなるのを防ぐため、全角スペースで整形しています。コピーして利用する場合は、全角スペースを除くか半角スペースに置換してください。 ・インターフェイスはextendsではなくimplements    class Compute implements plus,sub,mul,mod ・interface Mulで定義されたmulメソッドだけなぜか小文字で始まっている    interface mulの中で、int Mul(); ・System.stdinではなくSystem.in    InputStreamReader isp=new InputStreamReader(System.in); ・変数名にsLinsとsLineが混在している    これは元々どのようにしたかったのか分からなかったので、一例。    System.out.print("数1=");    String sLine=inp.readLine(); //1つめの数値を入力    int a=Integer.parseInt(sLine);    System.out.print("数2=");    sLine=inp.readLine(); //2つめの数値を入力    int b=Integer.parseInt(sLine); ・integerでなくInteger    int a=Integer.parseInt(sLine);    int b=Integer.parseInt(sLine); Javaでは普通、クラス名は大文字で始め、メソッド名は小文字で始めます。それを知っておけば、Integerはクラス名なので小文字で始めるのはおかしいと気付くはずです。

jun2249
質問者

お礼

プログラミング以外指摘して下さってありがとうございます。良く読んでみたらその通りでした。基本を忘れてしまってました。 それでコンパイルをやり直してみたのですが public static void main(String args[]) throws IOExceptionの部分で内部クラスがstatic宣言を持つことが出来ませんとでてしまいます。 これはどういうことなのでしょうか。知っていたら教えて下さい。 よろしくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • takaP-
  • ベストアンサー率79% (83/105)
回答No.4

>public static void main(String args[]) throws IOException >の部分で内部クラスがstatic宣言を持つこと>が出来ませんとでてしまいます。 たぶん、最初の質問時のままのソースで再コンパイルしたのでは? implementsにすべきところをextendsにしている為に、 コンパイラがクラスcalcをクラスComputeのインナー クラスと誤って読み取っているのでしょう。 #1さんが指摘した部分を含め、修正してから再度 コンパイルを行えばそのエラーは出なくなります。

jun2249
質問者

お礼

ありがとうございます。 ソースを更新してコンパイルしたのですがなぜか出来ませんでした。ただ、今日再度コンパイルしたときにはなぜかわかりませんがコンパイルが出来ました。

すると、全ての回答が全文表示されます。
  • jo-ji
  • ベストアンサー率72% (26/36)
回答No.3

私の環境(1.4.1_01)ではエラーになりませんでしたが、おそらく、public class calcにして、ファイルをcalc.javaとして保存すればよいと思います。 以下は参考です。 Javaでは、1つのファイルに、publicなクラスやインターフェイスは1つだけしか定義できませんが、今回の場合のようにpublicでないクラスやインターフェイスは他に定義できます。 しかし、それができるということと、そうすべきかどうかは別問題です。私の考えでは、規模が大きくなるほどどこに何があるのか分からなくなる可能性があるので、例えばComputeクラスはCompute.javaで定義されているようにした方が、ファイル数は増えますが分かりやすいと思います。

jun2249
質問者

お礼

ファイルをcslc.javaにしていたのですがなぜか出てしまいました。今日再度コンパイルしてみたらこのエラーは出なくなっていたのですが今度は String sLine=inp.readLine(); //2つめの数値を入力 の部分で sLineはmain(java.lang.String[])で定義されていますと出ました。 良く見てみてのですが(java.lang.String[])の意味がよくわかわりません。たびたびすみませんがこれはどういう意味をもつのでしょうか。

すると、全ての回答が全文表示されます。
  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

「うまく動かない」以前にコンパイルエラーになると思いますが。 とりあえず気がついたところで。 class Compute extends plus,sub,mul,mod → class Compute implements plus,sub,mul,mod インターフェースは拡張ではなく実装します。(しかし、このインターフェースは あまり意味が無さそうな気がする。) integer.parseInt(sLine) → Integer.parseInt(sLine) クラス名なのかインスタンス名なのかを意識しておきましょう。この場合はクラスメソッドなので クラス名(Integer)でアクセスできます。 予め Integer integer; などと定義しておく手もありますが、あまり意味はないでしょう。

jun2249
質問者

お礼

ありがとうございます。基本的なことを忘れてました。

すると、全ての回答が全文表示されます。

関連するQ&A