ドキュメントの読み方


言語仕様書

Javaの言語仕様は, The Java Language Specificationに書かれている.言語の仕様の全容を知るには, これを読む必要がある.言語仕様書の読み方の解説をする.目次のページを見 てみる.
  1. Introduction
  2. Grammers
  3. Lexical Structure
  4. Types, Values, and Variables
  5. Conversions and Promotions
  6. Names
  7. Packages
  8. Classes
  9. Interfaces
  10. Arrays
  11. Exceptions
  12. Execution
  13. Binary Compatibility
  14. Blocks and Statements
  15. Expressions
  16. Definite Assignment
  17. THreads and Locks
  18. Documentation Comments
  19. LALR(1) Grammer
  20. The Package java.lang
  21. The Package java.util
  22. The Package java.io
たとえば,どのような文(statement)があるかは 14. Blocks and Statementsを見ると分かる.読み方のポイントとして,たとえば while文の文法(Syntaxは) 14.10 The while Statementを見ると,
WhileStatement:
while ( Expression ) Statement WhileStatementNoShortIf:
while ( Expression ) StatementNoShortIf
のようになる.これは,BNF()という形式で書かれている.意味は「:」の左側 の構文要素は右側の構文要素からなるということである.斜体(イタリック)で 書かれたのは非終端記号(Non Terminal Symbol),立体で書かれたのが終端記 号(Terminal Symbol)で,それぞれ変数,文字列定数のようなものだと思って よい.斜体で表された非終端記号は仕様書の別の部分で定義されている.たと えば,Statement 14.4 Statementsで,以下のように定義されている.
Statement:
StatementWithoutTrailingSubstatement
LabeledStatement
IfThenStatement
IfThenElseStatement
WhileStatement
ForStatement
このように,構文要素に非終端記号として名前をつけていって,最終的には終 端記号に至るという形で,言語の文法(syntax)が定義される.言語の意味 (semantics)の定義では,BNFのような標準的な方法はない.操作的意味論,表 示的意味論などいくつかの数学的な定式化があるが,どれも容易ではないので, 論文の中以外ではあまり見掛けることはない.このJavaの言語仕様のように自 然言語(英語,日本語)で表現するのが一般的である.

パッケージと標準API

オブジェクト指向言語の特徴として,一度書いたコードを再利用できる点が あるが,いろいろな人が作ったライブラリを利用しようとすると同じ名前のク ラスを作ってしまうという心配がある.これを防ぐための仕組みがパッケージ である.ソースの最初に
 package jp.ac.u_tokyo.ecc.ktanaka;
のように定義しておくと,その中で
public class Soko{
}
のように定義したクラスの正式名は,jp.ac.u_tokyo.ecc.ktanaka.Soko となる.
 package jp.ac.u_tokyo.ecc.tt97170;
として定義した Sokoクラス jp.ac.u_tokyo.ecc.tt97170.Soko と区別するこ とができる.Java言語の基本的なライブラリ(標準 API)を除くと,このように クラスの作者のメールアドレスと関連づけたパッケージ名を使うことが推奨さ れている.ただし, このように書くと CLASSPATHで指定したディレクトリから 相対パス で jp/ac/u_tokyo/ecc/tt97170 となるディレクトリに置かれること を意味するので, 小さいプログラムではパッケージなどは作らなくても良い.

Java言語で標準的に使うことのできるクラスは標準API(Application Interface)と呼ばれる.言語の標準が,JDK1.0, JDK1.1, JDK1.2と変化するに つれて,標準APIも拡大してきている.

JDK1.1の標準APIは,センターのUnixシステムからは, JDK1.1標準API で 見ることができる.各クラスは,用途に応じて様々なパッケージに入っている. たとえば Stringは java.lang という名前のパッケージ,BufferedReaderは java.ioという名前のパッケージに属している.標準API中のBufferedReader は特になにもしなくても, java.io.BufferedReader という名前で用いることが できるが,ソースファイルの最初に

import java.io.*;
のように書いておくことによって,BufferedReaderという短い名前で使うこ とができる.なお,java.langというパッケージについてだけは明示的に
import java.lang.*;
としなくても短い名前を使うことができる.
オブジェクト指向の概念として,重要なものとして情報の隠蔽がある.ある クラスを使う(インスタンスを作る,サブクラスを作る)プログラマ(元のクラ スを作ったプログラマと別人である可能性が高い)に,想定しない使われ方を されないように,データフィールドやメソッドの一部をクラス外からは使えな くするというものである.この制限を外すための宣言が,データフィールドや メソッドの前につけた public である.

Java言語は教育用言語として開発された Pascalとは違って,大規模なプログ ラムを作るプロ向けに開発された言語なので,このような細かい機能が用意さ れているが,プログラミング入門のレベルでは,すべてのデータフィールドと メソッドに public をつけるという方針で良い.


課題1
前回の復習問題

前回までにこの授業のページに現れたサンプルプログラムで,「例外が起き る可能性があるのに例外処理をきちんとやっていなかった」ものを適当に1つ 選び,「適切と思われる例外処理をする」ように書き直し,例外処理をしてい ることがわかるような実行例を書きなさい.


次に進む