- 締切済み
【Java】親クラスでMainメソッドの出力
Javaについてです。 コマンドライン引数を複数渡し、数値の判定をtry/catchで行う。 catchメソッドには「stringFlg = true;」のみ。 渡ってきた値が数字のみの場合は、数値*数値の文字数を出力し、 数字のみでない場合は文字列を逆から1文字ずつ出力する。 上記のプログラムを下記のように変更したいです。 Testクラスで別パッケージのTest2クラスを継承し、Test2のLogメソッドを呼び出す。 引数で渡ってきた値をMainメソッドでコンソールに出力していたところを Logメソッドでコンソールに出力する。 Mainメソッドを呼びだそうとするとコンパイルエラーが起きる上に、 Mainメソッド内でLogメソッドをどこで呼び出せばいいのかイマイチ分かりません。 教えて下さい。 現時点のソースコードです。 package Test; import Test2.Test2; public class Test extends Test2 { public static void main(String[] args) { Test2 Log = new Test2(); boolean stringFlg = false; for (String arg : args) { try { int num = Integer.parseInt(arg); int nums = num * arg.length(); Log.Log(); stringFlg = false; } catch (NumberFormatException e) { stringFlg = true; }if(stringFlg){ char[] chars = arg.toCharArray(); for (int i = chars.length - 1; i >= 0; i--){ char str = chars[i]; Log.Log(); } } } } } package Test2; import Test.Test; public class Test2 { public void Log() { Test2 test2 = new Test(); System.out.println(test.main(args[0])); //コンパイルエラー } }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- yossy_kt
- ベストアンサー率50% (103/203)
ソースコードを見る限り、いろいろおかしな点があります。 まず、TestがTest2を継承する意味がよくわかりません。 Test.main()の中で、Test2 Log = new Test2(); としているので、TestがTest2を継承していてもしていなくても影響ないです。 仮に、TestがTest2を継承する意味があるとした仮定した場合、Test2 Log = new Test2(); は必要なく、Test2.Log()を呼び出す際には、Log.Log(); とするのではなく、単にLog(); だけで大丈夫です。 次に、Test2.Log()の中で、System.out.println(test.main(args[0])); となっていますが、test.main() は戻り値を持たないため、このコードは成立しません。 また、仮にtest.main() が戻り値を持つ場合、このコードは正常になりますが、Test.main() の中で Test2.Log()が呼び出されているため、終了条件がないと無限ループになります。 ちょっと何をされたいのか理解できないので何ともアドバイスが難しいのですが、取り敢えず、下記のようにすれば、取り敢えずは動くようになるのではないでしょうか。 package Test; import Test2.Test2; public class Test extends Test2 { public static void main(String[] args) { // Test2 Log = new Test2(); ←この行は不要。 boolean stringFlg = false; for (String arg : args) { try { int num = Integer.parseInt(arg); int nums = num * arg.length(); // Log.Log(); Log(nums); // ←直前の行はこのように修正。 stringFlg = false; } catch (NumberFormatException e) { stringFlg = true; }if(stringFlg){ char[] chars = arg.toCharArray(); for (int i = chars.length - 1; i >= 0; i--){ char str = chars[i]; // Log.Log(); Log(str) // ← 直前の行はこのように修正。 } } } } } package Test2; import Test.Test; public class Test2 { //public void Log() { public void Log(Object o) { // ←メソッドはこのように修正。 // Test2 test2 = new Test(); ← この行は不要。 // System.out.println(test.main(args[0])); //コンパイルエラー System.out.println(o); // ← 直前の行はこのように修正。 } } ちょっとご質問の趣旨と異なるかもしれませんが、ご参考になれば幸いです。
お礼
お礼が遅くなってしまいすみません。 参考にさせて頂いて動くようになりました。 ありがとうございました。 以下が書き直したソースコードになります。 package Test; import Test2.Test2; public class Test extends Test2 { public static void main(String[] args) { boolean stringFlg = false; for (String arg : args) { try { int num = Integer.parseInt(arg); int nums = num * arg.length(); Log(nums); stringFlg = false; } catch (NumberFormatException e) { stringFlg = true; }if(stringFlg){ char[] chars = arg.toCharArray(); for (int i = chars.length - 1; i >= 0; i--){ char str = chars[i]; Log(str); } } } } } package Test2; public class Test2 { public static void Log(Object o) { System.out.println(o); } }