私はJavaにとって非常に新しいです。私は、ファイルを読み込み、そのSHA1チェックサムを計算し、その結果を別のファイルに書き込むプログラムを書いています。エラーが発生した場合は、stderrにメッセージを出力し、指定された終了ステータスのSystem.exit()
を呼び出して実行を終了する関数err_exit()
を呼び出しています。これは私のmain()
関数がどのように見えるか、およそ次のとおりです。Java:例外と '初期化されていない可能性があります'
public static void main(String[] args) {
String in_fname = "C:/tmp/test.txt"; // not reading args yet
String out_fname = "C:/tmp/test.sign";
byte[] file_data;
String hexdigest;
try {
file_data = readFileAsByteArray(in_fname);
}
catch (java.io.IOException ex) {
file_data = new byte[] {0}; // note this line well, please
err_exit(2, "error opening input file '" + in_fname + "'");
}
try {
hexdigest = hexdigestSha1(file_data);
}
catch (NoSuchAlgorithmException ex) {
hexdigest = ""; // note this line well, please
err_exit(3, "could not compute SHA1 message digest!");
}
try {
writeFileFromString(out_fname, hexdigest);
}
catch (java.io.IOException ex) {
err_exit(2, "error writing output file '" + out_fname + "'");
}
System.exit(0); // success
}
私はよく注意することは、あなたを尋ねた2行があります。これらの行は、変数が初期化されていない可能性があるとコンパイラーが不平を言わないようにするためだけに存在します。
コンパイラが知る限り、catchブロックは続行される可能性があります。実際にerr_exit()
は返されないので、無効な値が渡されることはありません。
私の質問:この種のことを処理するための通常のJavaイディオムは何ですか? try
/catch
ブロックの行は醜いものです。さまざまな機能をerr_exit()
と呼び、このようなコードを明示的に使用しないことをお勧めしますか?私は明示的なチェックを好むと思うし、main()
機能がチェックを行うのに適切な場所ですが、私はフィードバックに興味があります。
try
/catch
ブロックを使用する予定がある場合、これはコンパイラの警告を消すのに適した方法ですか?
私がこれをPythonでやっていたのであれば、例外をキャッチせずにスタックトレースでプログラムを停止させることができます。エラーのスタックトレースは、そのユーザーが私であるので、このプログラムのユーザーに衝撃を与えません。 main()
という関数をthrows Exception
として宣言すれば、例外をキャッチできず、Pythonのような振る舞いをすることができます。それは正しい考え方のJavaの人々を私に惑わせる恐ろしい考えですか?
P.S.あなたが好きな本/ Webページ/私が読むべきJavaのイディオムがあれば、それに言及してください。
EDIT:変数名にアンダースコアを付けてお詫び申し上げます。私はすでに自分の実際のプログラムでそれらの名前を変更しましたが、ここでそのまま残します。実際には、私はPythonとCでプログラミングに多くの時間を費やしてきたからです。私はPythonの「PEP 8」スタイルまたは一般的なCスタイルのいずれかを使用していました。
これらの2つの変数を宣言する行を投稿します。 –
不足しているものを追加して完全な機能にしました。 StackOverflowが構文カラーリングをやっているので、もっと良く見えます。 – steveha