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

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

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

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

Q&A

解決済

2回答

74862閲覧

メソッドは型~で未定義ですというエラー

Tazusa

総合スコア41

Java

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

0グッド

0クリップ

投稿2018/05/11 13:23

編集2018/05/11 13:49

前提・実現したいこと

整数を二つ入力して、それらをかけた数と割った数を表示するプログラムを作っています。
メソッドを書いているのに未定義です、とのエラーが出てしまいます。
オブジェクトを生成しなくてはならないのでしょうか?

これらの原因と対応策を教えていただきたいです。
よろしくお願いします。

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

メソッド timeNumbersは型StartUpで未定義です メソッド divideNumbersは型StartUpで未定義です

該当のソースコード

import java.util.InputMismatchException; import java.util.Scanner; public class StartUp{ public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.println("二つの整数値を入力してください。"); int a; int b; try { a = stdIn.nextInt(); b = stdIn.nextInt(); }catch(InputMismatchException e) { System.out.println("整数値を入力してください。"); } try { timeNumbers(a, b); divideNumbers(a, b); }catch(ArithmeticException e) { System.out.println("0での割り算はできません。"); }finally { System.out.println("プログラムを終了します。"); } } }
public class MulDiv2 { public void timeNumbers(int a, int b) { System.out.println(a + " × " + b + " = " + a*b ); } public void divideNumbers(int a, int b) { System.out.println(a + " ÷ " + b + " = " + a/b ); } }

変更後

package problems16_2; import java.util.InputMismatchException; import java.util.Scanner; public class StartUp{ public static void main(String[] args) { Scanner stdIn = new Scanner(System.in); System.out.println("二つの整数値を入力してください。"); int a; int b; try { a = stdIn.nextInt(); b = stdIn.nextInt(); MulDiv2.timeNumbers(a, b); MulDiv2.divideNumbers(a, b); }catch(ArithmeticException e) { System.out.println("0での割り算はできません。"); }catch(InputMismatchException e) { System.out.println("整数値ではありません。"); }finally { System.out.println("プログラムを終了します。"); } } }
package problems16_2; public class MulDiv2 { static int timeNumbers(int a, int b) { return a*b; } static double divideNumbers(int a, int b) { return (double)a/b; } static void showResults(int a, int b) { System.out.println(a + " × " + b + " = " + timeNumbers(a,b) ); System.out.println(a + " ÷ " + b + " = " + divideNumbers(a,b)); } }

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

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

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

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

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

guest

回答2

0

Tazusaさんは、namespace(名前が有効な範囲)についての知識が不足しているのではないかと思われますので、少しnamespaceについて、あまり厳密ではない説明をしてみます。

山本家には、お父さんの太郎さんと、お母さんの良子さんと、子供の昴君が居るとします。
お隣の麻生家には、お父さんの太郎さんと、お母さんの美津子さんと、子供の歩美さんが居るとします。

山本家の中では、「お父さん」といえば山本太郎さんの事です。
麻生家の中では、「お父さん」といえば麻生太郎さんの事です。
同じように「お父さん」といっても、山本家の中と麻生家の中では別の人を指します。

これは「お父さん」というのが世界どこでも一人の人を指すのではなく、家庭内という範囲でのみ特定の人を指すからです。
このように「お父さん」で特定の人を指すことができる範囲(この例では家庭内)は、namespaceの一例です。

山本家で麻生太郎さんの話をする時には「太郎さん」ではなく「麻生家の太郎」さんと呼ばないと、山本太郎さんと区別がつきません。山本家というnamaspaceと麻生家というnamespaceは別だからです。

==
Javaのクラスも、或る種のnamespaceです。クラスで定義されたメソッドが、同じクラスで定義された別のメソッドを呼び出せるのは、同じnamespace(クラス)に属しているからです。

投稿2018/05/11 14:19

coco_bauer

総合スコア6915

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

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

0

ベストアンサー

良く見てください。

メソッド timeNumbersは型StartUpで未定義です

メソッド divideNumbersは型StartUpで未定義です

別のクラスに定義したメソッドを、都合よく見に行ってくれるはずがありません。
次のどちらかの方法で修正してください。

  • StartUpクラスに、必要なメソッドを定義する。
  • 呼び出す際、MulDiv2.timeNumbersのように完全な名前で呼び出す。

問題点2

上記の修正を施しても、まだエラーが出るはずです。
インスタンスを経由しないで呼び出したいメソッドは、static指定する必要があります。

問題点3

手元で動かしてみたら、まだエラーが潜んでいました。

Java

int a;
int b;
try {
a = stdIn.nextInt();
b = stdIn.nextInt();
}catch(InputMismatchException e) {
System.out.println("整数値を入力してください。");
}

例外が発生した場合 a および b が初期化されない恐れがあり、コンパイルできません。
入力に成功するまでループするか、失敗したときにmainメソッドから脱出してください。

問題点(?)4

除算したときに小数点以下が切り捨てられていますが、これは想定通りでしょうか。

投稿2018/05/11 13:26

編集2018/05/11 13:42
LouiS0616

総合スコア35660

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

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

Tazusa

2018/05/11 13:37

staticの存在をすっかり忘れていました。ありがとうございます。
Tazusa

2018/05/11 13:55 編集

私もstaticを直しているところでいろいろ気づきました。あたらしいコードを質問文に追記しました。 ただここで新しい問題が出てきてしまいました。0で除算しても「0での割り算はできません」が表示されず、終了してしまいます。 try文中に例外の出るコードを書けば例外発生時点でcatch内へ移るという理解なのですが、なぜそのようになってしまうのでしょうか。 問題点(3)についてはすみません、よくわからないです。コンパイルエラーにはなっていないのですが、もう少し詳細を教えていただけないでしょうか。 (4)については指定がなく考えていなかったので修正しました。
LouiS0616

2018/05/11 14:05

> 問題点(3)についてはすみません、よくわからないです。コンパイルエラーにはなっていないのですが、もう少し詳細を教えていただけないでしょうか。 現状のTazusaさんのコードなら問題ないです。 編集前は、不正な入力があった場合『整数値を入力してください。』と出力するのに、そのまま計算を行ってしまうような書き方になっていました。 --- > 0で除算しても「0での割り算はできません」が表示されず、終了してしまいます。 整数のゼロ除算以外では例外は送出されず、Infinityが返されるようです。
Tazusa

2018/05/11 14:14

問題点(3)について、確かにそうなっていました。どう動くかをしっかり見ていかなくてはならなかったですね。 --- double型になっているためにInfinityになってしまうということでしょうか。 そうだとすると「0での…できません」と表示させるには、catch(ArithmeticExeption e)のところをif(b == 0)にしなくてはならないですね。
LouiS0616

2018/05/11 14:17 編集

あるいは、divideNumbersの頭で自前で例外を投げるかですね。 if(b == 0) throw new ArithmeticException();
Tazusa

2018/05/12 02:20

そのような方法もあったのですね。if(b == 0) throw new ArithmeticException();で無事実行できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問