javaを始めたばかりのものです。
機能概略:
(1)テキストfile "in.c"をbuf[]に読み込む
(2)buf[]の内容を変換する。
(3)テキストfile "out.c"にbuf[]の内容を書き出す
問題点:
・コンパイルは、OK。
・実行時、下記 エラ-メッセ-ジがでてしまいます。
Exception in thread "main" java.lang.NoSuchMethodError: main

・ポインタ-が無いので、値渡しで渡して、値をかきかえることは無理?

以下
ソ-ス _002.JAVA
import java.io.*;
class ChangeData {
//コンストラクタ
ChangeData() {
}
/*++ 指定されたファイル名を読み込み*/
void SetInputData(String inputFile,
byte bBuf[],
int iInCntMax) {
//ファイルの読み込み処理を記述
//iInCntMaxに読み込みサイズを設定
}
/*++ データの変換処理 */
//ファイルの変換処理を記述
//この処理はまだ未記述
/*++ 指定されたファイルへ書き込み*/
void PutOutputData(String inputFile,
byte bBuf[],
int iInCntMax) {
//ファイルの書き込み処理を記述
//iInCntMaxサイズ分
//iInCntMaxに読み込みサイズを設定
}
}/*end クラス*/
/* メインルーチン----------------------------*/
class _002 {
public static void main() {
int iInCntMax,iOutCntMax;/*入力/出力buf長*/
ChangeData data = new ChangeData();
byte bBuf[] = new byte[0x100];
iInCntMax=iOutCntMax=0;
data.SetInputData("in.c",bBuf,iInCntMax);
data.PutOutputData("out.c",bBuf,iOutCntMax);
}
}

このQ&Aに関連する最新のQ&A

A 回答 (4件)

もう一つ質問があったのですね。


・ポインタ-が無いので、値渡しで渡して、値をかきかえることは無理?
という件ですが、一般論としてはa-kumaさんの回答の通りです。
が、ご質問のソースの中にある
//iInCntMaxに読み込みサイズを設定
というのは、無理です。
とりあえず、この場合は、関数の戻り値の型をintにしてそこへ返してしまう
のが手っ取り早い解決法ですが、本当はもう少しオブジェクト指向の基本的な
考え方を勉強して欲しいところです。
(ヒントだけ言うと、ChangeDataというのは名前からして手続き指向です。
「読み込まれたデータ」を表すクラスが一つあれば足りるケースだと思います。)
    • good
    • 0

あ、そうか。


Java の main メソッドは、引数なしはありません。常に
public static void main( String[] args )
です。
    • good
    • 0

ChangeData クラスのメソッドにpublic指定が無いので、


他クラスのメソッドであるmain()から見えないのだと思います。
void SetInputData( → public void SetInputData(
void PutOutputData( → public void PutOutputData(
としたら良いのでは。
    • good
    • 0

試していないのですが、



> ・実行時、下記 エラ-メッセ-ジがでてしまいます。
> Exception in thread "main" java.lang.NoSuchMethodError: main

エラーメッセージ通りで、class _002 のメソッド main() で、存在しない
メソッドを呼ぼうとしています。多分 ChangeData クラスのメソッドだと
思います。メソッド名と、その引数の方を再確認しましょう。

> ・ポインタ-が無いので、値渡しで渡して、値をかきかえることは無理?

Java はポインターと呼んでいないだけで、ほとんどが「参照」ですから、
心配するに及びません。

この回答への補足

publicに変更してためしましたが、
やはり
Exception in thread "main" java.lang.NoSuchMethodError: main
のメッセ-ジがでてしまいます。

補足日時:2001/06/21 13:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qclass Test_A {  main(){}}の実行順序は?

public class Test_A {
public static void main(){

int a = 0;
int b = 1;

}
}
例えば上のようなサンプルで何故 main()がクラスTest_A の中に挟まっているのでしょうか?実行順序としては main()が終了したら、クラスTest_A の方はどうなるのでしょうか? main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。よろしくお願いします。 

Aベストアンサー

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時には、Test_Aクラスのインスタンスは生成されません。
質問のコードでは変数a,bに値が代入され、それで終わりです。

Javaでは、(正確にはJavaVMは)実行するclassファイルにある、
String[]引数を持ったvoid mainメソッドを実行する仕様になっています。
しかし、mainメソッドを実行するときには何のインスタンスも生成されていないので、
何かのインスタンスのメソッドを実行することはできません。
なので、staticなメソッドでないとJavaVMが実行できないのです。
さらに、JavaVMからアクセス可能なスコープを与える必要があるので、
publicである必要もあるのです。

あとは、そのmainメソッドに指定されたコードを実行し、mainメソッドの最後まで処理が進んだら
そこでJavaVMが終了し、プログラムも終了します。

※細かい話ですが、main()からプログラムは始まりません。
正確に言うと、引数なしのmain()メソッドは他のメソッドと何ら代わりがありません。
プログラムを始めるには、
アクセススコープがpublicで、staticな戻り値のなく、引数にString配列を取るmainメソッド
であることが必要です。つまり、
public static void main(String[] args)
とするのが通常です。
試しに質問のコードをjavaコマンドで実行すると、NoClassDefFoundErrorが出るはずです。

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時...続きを読む

QInteger.parseInt()について public static void main(String[] args) { int a =

初歩的な質問だと思うのですが、、、

public class TestTree {

public static void main(String[] args) {

int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);

GreatTree myTree = new GreatTree(a, b);
myTree.makeTree();
myTree.makeGround();
}

}

というプログラムについて、Integer.parseInt()はどういう意味を持つのかがわかりません。ただ適当につけた名前だとは思えないです。教えてもらえたら幸いです。お願いします。

Aベストアンサー

> argsで入力されたものは例え数字でも文字列として扱われているから、それをintにしている。ということですよね?

引数として (String[] args) と設定されていますので、
おっしゃるとおり 引数 args[]配列に入っているものは、文字列です。

ポイントは、 「String[]」でしょうか。。

Q"try{}catch(){}"文で"close()"はどのように書けばよいのでしょうか。

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プログラム1
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


●プログラム2
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


なお、私の環境は以下の通りです。
OS: Microsoft Windows XP Professional SP2
開発環境:Eclipse 3.2.2
java: java version "1.4.2_13"

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プロ...続きを読む

Aベストアンサー

>私のこの考え方は正しいのでしょうか。
正しいです。質問者さんが書かれているやり方が一般的です。
念のため書いておきますが、outをtryの外で宣言しないとコンパイルが通りません。

まぁ、あくまでデザインパターンを学ぶための本ですから、細かなコーディングについて気にする必要はないでしょう(疑問を持つことは良いことですが)。

Qbyte[]→String変換後の文字列が違うのはなぜ?

byte[]→String変換の処理を行っていたのですが、
使うメソッド(コンストラクタ)によって結果が違ってきます。なぜだかよくわからないのですが、どなたかご説明していただけないでしょうか。

byte[]bt;
Stringstr1 = "12345", str2;

bt = str1.getBytes();

(1)str2 = new String(bt);
(2)str2 = bt.toString();

(1)の方法と(2)の方法では答えが違ってきます。(1)では"12345"でしたが、(2)ではなんだか記号などまざったぐちゃぐちゃな文字列でした。

よろしくお願いいたします。

Aベストアンサー

(1)が配列の内容を基に文字列を生成しているのに対し、
(2)は配列のインスタンス(内容ではない)を示す文字列を引き出しています。
全く別のものです。

QJAVAの質問です。 ( String args[] )それとも(String[] args) ?

MAINのこの引数ですが、
どちらが正しいのでしょうか?

また、そもそも この[]はなぜ必要なのでしょうか?
配列を意味していますか?

Aベストアンサー

mainに関してだけは (String[] args) が正しい・・・と思いましたが
( String args[] ) でコンパイルも実行も両方通ったのでどちらも正しいようです

配列を意味しています
例えば
String[] hai={"どちらも","正しい","とは","知らなかった"};
String hai[]={"どちらも","正しい","とは","知らなかった"};
ではどちらも配列を宣言した上でhai[0],hai[1],hai[2],hai[3]に文字列を代入しています。

String[] hai=new String[3];
String hai[]=new String[3];
で配列領域を確保してから
hai[0]="どちらも正しい";
のように代入してゆく方法もあります


main(String[] args) のString配列argsの中にはコマンドプロンプトでの実行時にプログラム名の後ろにスペースで分けて入力した文字列が[0]から順に代入されます

実行時に例えばHello.javaを実行するため

java Hello と入力して実行した時はargsには何も入っていませんが

java Hello nyuuryoku shita と入力して実行した時には

Hello.javaが実行された時mainメソッドの中で
args[0]には nyuuryoku が
args[1]には shita が代入された状態になっています

実行と同時に入力した値をプログラム内で使いたい時に用いる変数です

mainに関してだけは (String[] args) が正しい・・・と思いましたが
( String args[] ) でコンパイルも実行も両方通ったのでどちらも正しいようです

配列を意味しています
例えば
String[] hai={"どちらも","正しい","とは","知らなかった"};
String hai[]={"どちらも","正しい","とは","知らなかった"};
ではどちらも配列を宣言した上でhai[0],hai[1],hai[2],hai[3]に文字列を代入しています。

String[] hai=new String[3];
String hai[]=new String[3];
で配列領域を確保してから
hai[0]="どちらも正しい";...続きを読む


人気Q&Aランキング

おすすめ情報