2019年07月28日

中括弧でブロック作る範囲を間違え、必要なクラスもimportされてなくて2時間も疲弊。「x.intro();」で、他クラスの自己紹介用のメソッド呼び出してるのわからず…Systemクラスのinフィールドで標準入力を取得して…BufferedReader br = new BufferedReader(new InputStreamReader(System.in));の謎について

昨日、クラムボンがツイッターのトレンド入りしてみたい。どうやらフジロックがあったみたいで、

波よせて
1.KANADE DANCE
2.シカゴ
3.Lush Life!
4.nein nein
5.グラデーション
6.yet
7.タイムライン
8. reflection eternal with toe.徳澤青弦

のセットリストだったらしく、特にラストの「reflection eternal with toe.徳澤青弦」が「感動すぎた」「やばい」といった感じで絶賛の嵐だったそうよ。
あ〜いいなー。そういう感動体験、味わいたいね。
マイナスの方向の感動体験ばかりよ。そんな今日も、家でjavaのコード見ないといけない。
なんてったって、やるって決めたからには、簡単に逃げ出すわけにもいかない。
負け犬になっちゃう、そんなすぐ、自分のやると決めたこと曲げるなんてな。
1年やった負け犬と、3年やった負け犬なら、3年やった負け犬の方が信頼できるっていうか、評価できるはず…とはいえ誰かに評価してほしいとかいう人の目をそんな気にしてるというわけではないんだけど。

とかいって、変に自分を鼓舞したり、熱いメッセージ言ったり、人から聞かされるの、すごく苦手というかこそばゆい感じになる。
いわゆるルーキーズ的な、ちょっと喩えが古いけど。佐藤隆太的な熱血教師とか、夢を追う若者みたいな、そりゃステキかもしれんけど、ドラマなら耐えられるけど、そういうムードが日常にふと出てくると、ちょっと寒気が走る。

そういう時、なんて俺は冷たい人間だと思う時もあったが、そうでもないことに気付いた。
寒気が走ったのは、たぶん、美化してるからだろうからな。
自分の人生とか、仕事とか、活動とか、熱い思いを、美化して語る。
そのパフォーマンスが、「すごいですね」待ちみたいになって、疲れるんだよな。
そんなに自分の人生を美化したり、神聖化して語るけど、それ自慢と変わりないし。聞かされて太鼓持ちする方の気持ちも考えてくれということね。まあ太鼓持ちが嫌ってわけじゃないけど。「もうそのぐらいでええでしょ」というラインはあるのに、度が過ぎて語りをやめないケースもあったりね。

かといって俺のように自分の人生を卑下する方向に走りがちなのもよくないかもしれんけど。
「もうかりまっか」と言われたら、「ぼちぼちでんな」「全然ですよ」というコミュニケ―ションは実は温かくて、ここで「いや〜調子いいですよ!」とか「ばんばん売れてますね」みたいに正直に自慢するの、まあすごく正直な感じだと逆に気持ち良かったりするけど。
それがうまくないと、自慢にしか聞こえなくて。
謙虚に「ぼちぼちでんな」「全然ですよ」といって、変に自分のライフワークを美化したりせずに、相対的に自分ばかりが持ち上がらないように、ピエロになるまではいかなくと主役感を出し過ぎないというこの応え方は、デリカシーがあると思うね。

俵万智のサラダ記念日にある「「寒いね」と話しかければ「寒いね」と答える人のいるあたたかさ」は、「ぼちぼちでんな」「全然ですよ」にあるってことよ。相手に共感して、自分を持ち上げない謙虚さね。

とかだらだら、全然、プログラム書いてない。前に書いた?というか、古いメールに残ってて記載されてたコードが、エラーだったせいもある。
そのプログラムは、

public static void main(String[] args) throws IOException

の1行だけに、

この行に複数マーカーがあります

- 変数 main に void は無効な型です
- トークン "(" に構文エラーがあります。正しくは ; です
- 構文エラーがあります。";" を挿入して LocalVariableDeclarationStatement を完了し
てください

っていうエラーがあって。そのコードに「うーん」と昨日、スタバで1〜2時間は悩まされたりしたけど。
大したミスでもなくて、

package dj_shikabane;
public class Game {
{
public static void main(String[] args) throws IOException
・・・

の全文のコードで、中括弧 "{"が1個、いらなったってことだった。そんで、

package dj_shikabane;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Game {
public static void main(String[] args) throws IOException
・・・

の3つの「import java.io.BufferedReader;」「import java.io.IOException;」「import java.io.InputStreamReader;」の3文が足りなかった。ioライブラリのBufferedReader、IOException、InputStreamReaderクラス入れてなかったから、そのクラスにあるreadLine();メソッドも、使えないわな。

「Integer.parseInt」のころではエラーはなかった。IntegerクラスのparseIntメソッドは、imput文を省略してもいいlangライブラリに属してるからだろうな。

あと、他クラスのメソッド呼んでたのも気付くのにすごい時間かかった。

BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));

っていうコードも、すぐには読み解けない。

まずBufferedReaderクラスの型を、クラス型の変数brに格納してる。
InputStreamReader(System.in)は何だ、これよくわらかん。
たぶんInputStreamReader型の、引数にSystem.inってことは…わからん。
入力のあるプログラム(演習2)http://www.ibe.kagoshima-u.ac.jp/edu/gengo2j/p6.html に、解説があった。

Systemクラスのinフィールドで標準入力を取得、まずこれが最初っぽいな。Systemクラスは、Exlipse上でF3キーを押せば、その中身が読める。たしかにフィールドの部分に、

// フィールド記述子 #21 Ljava/io/InputStream;
public static final java.io.InputStream in;

って、記述されてた。まあここまではよしとしよう。
全体を見ると、インスタンス、オブジェクトを生成しているのはわかる。new演算子があるからな。
・・・

解説
• readLineメソッド
▫ String line = reader.readLine(); ▫ 文字列を1行分取得するメソッド

• readerは?
▫ BufferedReader型の変数 ▫ 参照型のクラス
▫ データの読み込みを行うためのクラス

• new
▫ newの後にクラス名と()を付けると、そのクラスに属するオブジェクト生成を行う →これをインスタンス生成と言う


を読むと、何かわかってきそうな気がする。BufferedReaderクラスとInputStreamReaderクラス使うには、単にimport文だけ書けばいいってわけじゃなくて。クラス使うためのオブジェクト(インスタンス)を生成しないといけないって話。

よくわからないのは、BufferedReader(new InputStreamReader(System.in))と、入れ子構造みたいに、BufferedReaderクラスとInputStreamReaderクラスが、同時にインスタンス生成してるっぽくなってる点よ。
たぶん、引数とコンストラクタについて、まだ俺がちゃんと理解してないからだろうな。

コンストラクタはクラス名と同じ、というルールがある。
いや、違うな…コンストラクタは、この段階では出てきてない。

まだインスタンスを生成しただけの段階。

InputStreamReaderはInputStreamからbyte型データを受け取りUnicodeの文字に変換して文字(char型)として読み取れるようにするオブジェクトです。

 byteデータをSystem.inから読み、JISの文字コードを自動判定し、Unicode文字に変換して読むインスタンスは次のように作ります。このインスタンスからreadメソッドを使ってchar型のデータを読み出せます。http://www.ibe.kagoshima-u.ac.jp/edu/gengo2j/p6.html

new InputStreamReader(System.in, "JISAutoDetect");
っていう解説が、たぶん正しいんだと思う。Systemクラスのinフィールドから読み込む、どういう機構なのかわらないが、標準入力の仕組みは脇に置いとこう。それで沼にはまってる場合じゃないし。

つまり、まとめると。

BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));

は、オブジェクト生成してる。BufferedReaderクラスを使うためのオブジェクトと、InputStreamReaderを使うためのオブジェクトの2つを。
そんでオブジェクトを作る時に、事前に処理を定義しておけば、それを自動的行ってくれる。いわば初期処理がコンストラクタ。

でもそれは勘違いで、コンストラクタ作ってるわけじゃなくて。
そもそもBufferedReaderクラスとInputStreamReaderクラスは、ioライブラリにある既に完成されたクラスだから、なんでjavaの利用者がコンストラクタを定義せないかんの?って話だ。

だからコンストラクタの話は関係ない。

これはフィールドとかメソッド、を呼び出すための準備。
オブジェクト生成なんだから。
InputStreamReaderクラスを使うためのオブジェクト生成時に、引数としてSystem.inからbyteデータを受け取る。
BufferedReaderクラスを使うためのオブジェクト生成時に、引数として、InputStreamReaderクラスによってUnicode文字に変換された文字「new InputStreamReader(System.in)」を、受け取る。

一旦、そういう風な理解で留めておこう。

おまじない、で覚えておいて、さっさと色々なコードを書いて慣れた方が気もするけどな。
どうも性格的に、一行一行、理屈を知りたくなるんだな、ほんとに。
posted by DJしかばね at 13:18 | Comment(0) | Java学習 | このブログの読者になる | 更新情報をチェックする

2019年07月27日

SQL Developerが「C:\Users\★ユーザー名★\AppData\Roaming\SQL Developer\system4.1.4.21.21\o.ide.12.2.1.0.42.151001.541\projects」とかいう訳の分からない階層に

あったせいで、なかなか勉強をスタートできんかった。
やっぱデスクトップにショートカップ的なの置いとくべきか、すぐに着手するように。
はぁ、しかし面倒臭い。が、風呂入るとなぜか疲労感が飛んで、やる気が湧いてきたので。
この勢いにまかせてやるとするか。

CREATE USER (ユーザー名) IDENTIFIED BY (パスワード);
GRANT ALL PRIVILEGES TO (ユーザー名);

で、スキーマとかいうのを作れる。まあユーザーごとのデータベース、みたいなもの。
そんで「接続」からOracleに接続できる…と、思いきや。
ORA-12505エラーで、全く接続できない。本来なら調べるべきだか、今日は「既存のスキーマでいいかぁ」と思って、既に作ることに成功してたスキーマを利用することにする。

そんでEclipseのJDBCドライバを利用して、DBに接続する。
プロジェクト作って、libフォルダ作って、jdbdドライバをコピーして。
プロジェクト上で右クリックして外部Jarを追加。
Jarどこに置いたかわかんなくなった。

C:\eclipse-jee-oxygen\workspace\jdbc_sample\lib\ojdbc7.jar

にあったけどね。
そんでDB接続処理のメソッドを呼び出すために、そのメソッドが入ってるJDBCドライブクラスをJVMに登録するって話。

private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";

のおまじないを、データベース接続する時に書くとか何とかいう話ね。

てか、プロジェクト作らなくてよかった。zipファイルは持ってたから、適当にどっか既存のパッケージにインポートすればよかった…。
いやでも、それでインポートしてみたらしてみたで、文字化けしてるから腹立つな〜ほんと。
けどサクラエディタで開いたら、文字化けしてないから。
サクラエディタの内容をコピペして、Eclipse上でに貼り付けたらこれは解決。

なぜかインポートしたら、javaファイルが、

/(クラス名)/jdbc_sample/src/jp/co/sss/jdbc/(javaファイル名).java

みたいな、超深い階層にあることに気付いた。
これだと、javaファイルをコンソール上でなぜか実行できない。
いや、パッケージ作らずにインポートしたからってのもあるかもしれない。
ああ〜わかった。srcフォルダにインポートしてなかったから、実行できなかったんだ。
なんでsrcフォルダにインポートしなきゃいけないのかはよくわからんけど、まあいいや。

さっそく実行。

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

とかいうエラー。だが、これは想定内。「・・・lib\ojdbc7.jarがない」っていうエラーか、たぶん。
同じパッケージ内の同じ階層、javaファイルと外部jarファイルが同居してないといけないのか。
と思って試したら、今度はこんなエラー。

java.sql.SQLException: ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。

朝からもう〜って感じだな〜。
posted by DJしかばね at 17:32 | Comment(0) | Oracle | このブログの読者になる | 更新情報をチェックする

2019年07月21日

名言

なにもしないないら
posted by DJしかばね at 03:18 | Comment(0) | 説教・持論・駄文 | このブログの読者になる | 更新情報をチェックする

2019年07月16日

ファイル名のクラス(.java)の中には原則、同じ名前のクラス名を記述し、そのクラスにmainメソッドがない場合、Javaアプリケーションをコンソール上で実行できない

この曲カッコいいな。


でもこんな曲が、バスターミナルとか町の先頭とか駄菓子屋とかで流れてたら違和感ありまくりって感じだな。


っていう、まとめもあったように。
そうなんだよな。バスタ新宿に併設してるNeWomanだったか?NEWWOMAN?New Woman?スペル忘れたが。
お土産にしては高いっていうかハイソ過ぎるっていうか、「これじゃない感」は確かに半端ないよな。
東京ソラマチみたいなテナントが入ってたら結構、いい気もするんだけどね。

閑話休題。

本題に入るか、記事のタイトルについて。どういうことかというと…

------------------------------
package dj.shikabane;

public class Underdog {
String musician;
String track;
}

class start {
public static void main(String[] args) {
Underdog music = new Underdog();
music.musician = "Tom Misch";
music.track = "South Of The River";
}

void show(String musician,String track) {
System.out.println("今日聴いた名曲は" + track + "です");
System.out.println("アーティスト名は" + musician + "です");
}
}
------------------------------

このコード、おかしいんだよな。
Eclipse上でコンパイルはできるのに、Javaアプリケーションで実行してコンソールで表示させることができない。
理由を探したところ、


であることが判明した。
ファイル名とクラス名が異なる、mainメソッドのあるクラスがファイル名と異なる、つまり。

------------------------------
package dj.shikabane;

public class start {
String musician;
String track;
}

class Underdog {
public static void main(String[] args) {
start music = new start();
music.musician = "Tom Misch";
music.track = "South Of The River";
}

void show(String musician,String track) {
System.out.println("今日聴いた名曲は" + track + "です");
System.out.println("アーティスト名は" + musician + "です");
}
}
------------------------------

と、ファイル名とmainメソッドのあるクラス名を同一にすれば行けるかと思ったが、publicの箇所で、まだエラーが出る。

------------------------------
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
public 型 start はそれ独自のファイル内に定義されなければなりません

at dj.shikabane.start.(Underdog.java:3)
at dj.shikabane.Underdog.main(Underdog.java:10)
------------------------------

な感じの。
でもJavaアプリケーションで実行することができた。

------------------------------
package dj.shikabane;
class start {
String musician;
String track;
}

public class Underdog {
public static void main(String[] args) {
start music = new start();
music.musician = "Tom Misch";
music.track = "South Of The River";
}

void show(String musician,String track) {
System.out.println("今日聴いた名曲は" + track + "です");
System.out.println("アーティスト名は" + musician + "です");
}

}
------------------------------

maiメソッドのある方のクラスにpublic付けるとエラーが消えた?
これは謎だな…今後、調べよう。
エラーなくコンパイルできるんだけど、結果が何も出力されんかった。
そうか、Underdogクラスでshowメソッドを呼び出してるのに、startクラスにshowメソッドが定義されてないからかな。

------------------------------
package dj.shikabane;
class start {
String musician;
String track;
void show(String musician,String track) {
System.out.println("今日聴いた名曲は" + track + "です");
System.out.println("アーティスト名は" + musician + "です");
}
}
public class Underdog {
public static void main(String[] args) {
start music = new start();
music.musician = "Tom Misch";
music.track = "South Of The River";
}
void show(String musician,String track) {
System.out.println("今日聴いた名曲は" + track + "です");
System.out.println("アーティスト名は" + musician + "です");
}
}
------------------------------

何で同じクラスなのに中身一緒のshowメソッドがある?これでもコンパイルできちゃうってのがおかしいよな。
実行しても、何も出てこないけど。

------------------------------
package dj.shikabane;
class start {
String musician;
String track;
void show() {
System.out.println("今日聴いた名曲は" + track + "です");
System.out.println("アーティスト名は" + musician + "です");
}
}
public class Underdog {
public static void main(String[] args) {
start music = new start();
music.musician = "Tom Misch";
music.track = "South Of The River";
music.show();
}
}
------------------------------

これでオッケー。
セオリー通り、mainメソッドのあるクラスからshowメソッドを呼び出して。
処理の中身は別のクラスに書く感じだ。

さて、今日聴いたTom Misch、かなりいいな。

Tom Misch - South Of The River (Official Audio)

ストリングスの使い方が何かJamiroquaiちょっと思い出したけど、若干違う。アコギとか手拍子とか口笛とか、プリミティブな音色も混じってて、かなり音作りこだわってるな。
ボーカルmainって感じじゃない。ボーカルも音として他の音と調和してる。

Tom Misch - Water Baby (feat. Loyle Carner) (Official Video)

JazzyPianoHipHopだ!氷上でドレッドヘアのcoolな黒人がダンスしてるPVも素敵。
『Geography』 - Tom Misch 買うかな、また。
posted by DJしかばね at 00:31 | Comment(0) | Java学習 | このブログの読者になる | 更新情報をチェックする

2019年07月12日

「非staticフィールドageをstatic参照できません」がよくわからん/「javaにおけるstaticと非staticの判断基準」「静的メンバがインスタンスを生成しなくても利用できるなら、逆にインスタンスを生成することで何が利用できるのか?」も不明

超絶エラー出まくりのコード。

package dj.shikabane;

public class Underdog {
String name;
int age;
}

public static void main(String[] args) {
Underdog underdog1;
underdog1 = new Underdog();
underdog1.name = "負け犬";
underdog1.age = 100;

System.out.println("名前は" + name + "です");
System.out.println("年齢は" + age + "歳です");
}

何でだ?「ネストされた型 Underdog はエンクロージング型を隠せません」は、消すことができたけど。
一行ずつ考えてみた。
まず、

public class Underdog {
String name;
int age;
}

について、ブロックの終わり、最後の’}'でエラーが出ている。
これは何となく、あれじゃねえか。フィールドしかないから、クラスの中に。
恐らく「フィールド(性質)しかないクラスってどうよ?メソッド(機能)も入れてくれ」って話なのか?
いや、でもフィールドだけでも大丈夫だったような…。

package dj.shikabane;

public class Underdog {
static String name;
static int age;

public static void main(String[] args){
Underdog underdog1;
underdog1 = new Underdog();
underdog1.name = "負け犬";
underdog1.age = 100;
System.out.println("名前は" + name + "です");
System.out.println("年齢は" + age + "歳です");
}
}

無理矢理コンパイルした。
ちゃんと結果も出力された。でも、

Open the Java > Compiler > Errors/Warnings preference page and
highlight the problem to configure its severity.
問題: static フィールド Underdog.age には static にアクセスする必要があり
ます

みたいな、×エラーじゃないんだけど、⚠エラーが残る。何か気になる。Underdog.age、じゃねーっつーの。
Underdog1.nameとかUnderdog.ageと、書いてるのに。
もしかして、「Underdog underdog1」みたいに、underdog1っていうクラス型変数?をいちいち用意したせいか。

コンパイルするためになぜか、static付けないといけなくなったのも疑問だ。


で、少しは理解できた。
フィールド及びメソッドの静的メンバには、修飾子staticが付いて、そいつが付いてるメンバはクラスフィールドとかクラスメソッドっていう。
つまるところ、

package dj.shikabane;

public class Underdog {
static String name;
static int age;

public static void main(String[] args) {
Underdog.name = "負け犬";
Underdog.age = 100;
System.out.println("名前は" + name + "です");
System.out.println("年齢は" + age + "歳です");
}
}

だと、コンパイルできたし、問題なくプログラムの結果も出力できた。
クラス型変数underdog1も、ややこしいから消去。

変数nameも変数ageも、別にインスタンスも生成してくても利用できるクラスフィールドだから、普通に使えた。
逆に「インスタンスを生成しないと使用できないインスタンスフィールドとかインスタンスメソッドって何?」って話だ。

それを考える前に、クラスフィールドから呼び出しているコードだけど。
static除くと「非staticフィールドUnderdog.nameをstatic参照できません」とかいうエラーが出てくる。
何このエラー?そもそもjavaにおけるstaticと非staticの判断基準って?

なんていうか、

package dj.shikabane;

public class Underdog {
public static void main(String[] args) {

String name = "負け犬";
int age = 100;

System.out.println("名前は" + name + "です");
System.out.println("年齢は" + age + "歳です");
}
}

でも、別にいいのよ。ちゃんと同じ結果出るし。
しかしこれはすごい単純なコードなんだよな。単にnameとageに値を入れて、出力してるだけだから。
フィールド変数を使用せずにクラス型配列の中身を表示 https://teratail.com/questions/7492 みたいな話があるってことは、べつにフィールドが無くてもいいっていうか。
でもそれはオブジェクト指向プログラミングじゃないから、セオリーじゃないって話か。
すごい簡単なコードなら、別にフィールドに性質とか状態とか属性のデータを入れるためのフィールド変数とか用意しなくても、直接、適当に型だけ指定した変数に値を入れて出力してもいいし。
さらにいえば、変数とか用意せずに、値をそのまんま書いて標準出力してしまえばいいってなる。
でもそれだと、プログラムが複雑になった時に保守性とかが悪くなるから、やっぱり無理にでもフィールドとか使ってみないといけないんだよな。

というわけで、フィールドとかはちゃんと書いて、無理矢理コンパイルしたコード↓

-------------------------------
package dj.shikabane;

public class Underdog {
String name;
int age;

public void main(String[] args){
Underdog underdog1;
underdog1 = new Underdog();
underdog1.name = "負け犬";
underdog1.age = 100;
System.out.println("名前は" + name + "です");
System.out.println("年齢は" + age + "歳です");
}
}
-------------------------------

staticを除いてみた。するとコンパイルはできたのに、実行したらこんなエラーが出た。

エラー: メイン・メソッドがクラスdj.shikabane.Underdogのstaticではありません。次のようにメイン・メソッドを定義してください。
public static void main(String[] args)

何でstaticじゃないといけないの?
ちょっと考える必要あるな。
posted by DJしかばね at 00:40 | Comment(0) | Java学習 | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。