質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

1280閲覧

エラーの解決法が分かりません

okaa33.

総合スコア2

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/10/03 08:50

前提・実現したいこと

Javaで修正方法が分かりません。

発生している問題・エラーメッセージ

ShowingPrimeNumber.java:7: エラー: setNumに適切なメソッドが見つかりません(引数がありません)

ShowingPrimeNumber.java:7: エラー: setNumに適切なメソッドが見つかりません(引数がありません) System.out.println("pn1にセットされている数値:"+pn1.setNum()); ^ メソッド NaturalNumber.setNum(int)は使用できません (実引数リストと仮引数リストの長さが異なります) メソッド PrimeNumber.setNum(int)は使用できません (実引数リストと仮引数リストの長さが異なります) エラー1個

該当のソースコード

Java

1class NaturalNumber{ 2 private int num = 1; 3 public void setNum(int n){ 4 if (n > 0){ 5 num = n; 6 } 7 } 8 public int getNum(){ 9 return num; 10 } 11 public NaturalNumber(){ 12 } 13 public NaturalNumber(int n){ 14 setNum(n); 15 } 16 } 17 18class PrimeNumber extends NaturalNumber{ 19 20 @Override 21 public void setNum(int n){ 22 for (int i=2; i<n; i++){ 23 if ( n % i == 0){ 24 setNum(n); 25 } 26 } 27 } 28 public PrimeNumber(){ 29 super(); 30 setNum(2); 31 } 32 public PrimeNumber(int x1){ 33 super(); 34 setNum(x1); 35 } 36} 37 38class ShowingPrimeNumber{ 39 public static void main(String[] args){ 40 41 PrimeNumber pn1 = new PrimeNumber(); 42 PrimeNumber pn2 = new PrimeNumber(37); 43 44 System.out.println("pn1にセットされている数値:"+pn1.setNum()); 45 46 pn1.setNum(10); 47 System.out.println("pn1にセットされている数値:"+pn1.getNum()); 48 49 pn1.setNum(19); 50 System.out.println("pn1にセットされている数値:"+pn1.getNum()); 51 52 System.out.println("pn2にセットされている数値:"+pn2.getNum()); 53 } 54}

試したこと

検索し、似たようなエラーの解決法がないか調べましたが見つかりませんでした。
自身でも修正したが解決できませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/10/03 09:54

エラーが出ている箇所で、本当にsetNum()を使いたかったのでしょうか? 単純に、getNum()としたかったのをsetNum()と書いてしまってハマッているだけでは? ご自身がやろうとしていることを理解されていますか? ※しかし、それを直すと新たな問題に直面します。setNum()の中でまたsetNum()を呼んでます。
guest

回答3

0

ベストアンサー

そもそも基礎自体が出来ていないです。

とりあえずエラーメッセージを読みましょう。エラーメッセージにヒントが隠されています。

ShowingPrimeNumber.java:7: エラー: setNumに適切なメソッドが見つかりません(引数がありません) System.out.println("pn1にセットされている数値:"+pn1.setNum()); ^ メソッド NaturalNumber.setNum(int)は使用できません (実引数リストと仮引数リストの長さが異なります) メソッド PrimeNumber.setNum(int)は使用できません (実引数リストと仮引数リストの長さが異なります) エラー1個

メッセージを読むと、「なあ、引数が足りないんだけど?」と言われていますね。

問題のメソッドは pn1.setNum() です。

では、このpn1 とはなんでしょうか。
PrimeNumberですね。

つまり、PrimeNumberのsetNumメソッドを動かそうとしています。
では、そのsetNumメソッドの定義はなんでしょうか。

public void setNum(int n) ですね。

では、呼び出し側はどうなっているでしょうか。

System.out.println("pn1にセットされている数値:"+pn1.setNum());

ですね。

…あれ? なんか引数が足りませんよね?
定義上では int型のデータを引き受けていますが、呼び出すときは何も指定していません。

それに、意味もおかしいです。

setNumってどういう意味でしょうか。

set (オブジェクトのフィールドとして追加する) + Num (数字を)

ですよね?
でも質問にあるコードではなんか、getNum的な使い方をしている。

それに、setNumの型はvoidです。
ということは『戻り値無し』です。それなのに、戻り値を受け取ろうとしています。

class PrimeNumber extends NaturalNumber{ @Override public void setNum(int n){ for (int i=2; i<n; i++){ if ( n % i == 0){ setNum(n); } } } public PrimeNumber(){ super(); setNum(2); } public PrimeNumber(int x1){ super(); setNum(x1); } }

のPrimeNumberクラスを見てもおかしいです。

そもそも何がしたいのでしょうか。
このクラスの役割・責務はなんでしょうか。

コードから考えられるのは、

  1. 100以下の素数を保持する系
  2. 素数な数字だけ持つ(ただし一つだけ)

が思いつきますね。

2の場合は、たとえば n = 100 なら素数ではないので『データなし』、
n = 3なら素数なので、『3』を持つ。

という風に。でもこの可能性はなさそう。

それなら1ということに。
でもこのコードだとそんな処理はできませんよ。

まず、ご自分のコードを読んでください

コードを読むコツは、『一行レベルで、その行が何をしているかを考えながら読む』です。

// NutralNumberを継承してPrimeNumberを定義 class PrimeNumber extends NaturalNumber{ // オーバーライドしたものである @Override // setNumメソッドを定義 public void setNum(int n){ // i の初期値: 2, i が n未満の間, +1しながらループ for (int i=2; i<n; i++){ // n が 2で割り切れるなら if ( n % i == 0){ // 自身を再起的に呼び出す setNum(n); } } } // 空のコンストラクタ? public PrimeNumber(){ // 親のコンストラクタを呼び出す super(); // 自身のsetNumメソッドを呼び出す setNum(2); } // 引数が一個あるコンストラクタ? public PrimeNumber(int x1){ // 親のコンストラクタを呼び出す super(); // 自身のsetNumを呼び出す setNum(x1); } }

これをmainメソッドとかでもやってみてください。

そうすると、このコンストラクタ内で、setNumを呼び出しています。

ですが、その自身のsetNumメソッドでは、『自身を再帰的に呼び出しているだけ』です。そうなると無限ループに陥るはずです。

関数、再起メソッド?がわかっていればありえない問題です。

言いすぎましたね…。

再帰メソッドは簡単に言えば、『自身を呼び出している状態のメソッド』です。
詳しくは再帰メソッドで調べてください。

仮に『親のsetNumを呼び出したい』のなら、super.setNum(2); のようにsuperをつけるはずです。

同様に、NaturalNumberクラスも同じように読みます。

すると、『どこでデータを持っているのか』が疑問に思いませんか?

確かにNaturalNumberが保持しています。
ですが、それは『一個だけ』です。

データを複数保持したいなら配列かArrayList, LinkedListといったデータ構造?を利用するはずです。
変数では一個しか保持できません。

それと、インデントは揃えましょうです。

NaturalNumberクラスでの{と} が合っていません。個数自体は合っていますが、読みづらいです。

setNumメソッド内でもfor文内のif文もインデントがないため、読みづらい。

この程度のコードなら問題ありませんが、普通、自分用のCLIとかを作るだけでも割と複雑な構造になりやすいです。
(特に初心者の頃は)

それを『コードレビューしてくれ』とか言われたらもう、キレると思いますよ。

日本語の小説でも、改行なし、ひらがなのみ、句読点無しみたいなものです。

読めなくはないが、読む気失せますね。
(子どもが書いたものだったらわからないではないが…)

それと一緒です。

まずは基礎を理解して、今までに述べたものすべてやりましょう。それからです。

質問者さんがやるべき範囲: ■ 変数、配列 ■ クラス ■ メソッド、引数、戻り値 ■ プログラミングとは ■ エラーメッセージを読むこと ■ コードを読むこと ■ ロジックの考え方 ■ インデントを入れて読みやすくすること ■ 可読性を上げる方法 ■ デバッグ方法

投稿2021/10/03 12:18

編集2021/10/03 22:34
BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/10/03 18:29

> 再起関数、再起メソッド?がわかっていればありえない問題です。 再"帰"です。また、質問者さんは初心の方であることは明らかなのですから、「再帰処理に関して理解している」ことが前提というのは少々無理がある、と言いますか酷ではないでしょうか。
BeatStar

2021/10/03 22:26

再帰の件は…単純な変換ミスですね。修正します。 > 「再帰処理に関して理解している」ことが前提というのは少々無理がある あー、確かに…
guest

0

lang

1System.out.println("pn1にセットされている数値:"+pn1.setNum());

setNumを引数なしで呼び出しています。

まずエラーメッセージを読みましょう。2行目にエラー箇所が出力されています。

ShowingPrimeNumber.java:7: エラー: setNumに適切なメソッドが見つかりません(引数がありません) System.out.println("pn1にセットされている数値:"+pn1.setNum()); ^ メソッド NaturalNumber.setNum(int)は使用できません (実引数リストと仮引数リストの長さが異なります) メソッド PrimeNumber.setNum(int)は使用できません (実引数リストと仮引数リストの長さが異なります) エラー1個

投稿2021/10/03 08:55

編集2021/10/03 08:58
jhashimoto

総合スコア838

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

set〇〇はセッターで、返却値もvoidですし出力に使うのは間違っていると思います。
本当は pn1.setNum(10);のようにセットしてから使いたかったか、初期値を確認したかったのでは?

投稿2021/10/03 09:15

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問