1.コンパイルエラーの出る個所と、実際しくじっている場所が割と近い。
VC++、しばしばcore.hとかでアサーションが山ほど出るが、勿論core.h自体が悪い訳ではない。どこでしくじったかは、推理と直感、そして怪しい行をコメントアウトでコンパイルして探るのだ。時間かかる。
JavaはEclipse様がご指摘して下さる個所かその直近の参照先が違っている事が多め。
2.落ちる個所と、実際しくじっている場所が割と近い。
VC++、しばしばa=b;のような何の変哲もない所で落ちるが、勿論その行は問題無い。実は遥か彼方で行った、全く別の処理のmemcpyがまずいのだ。
Javaは、9割方、Exception起こした行で何かやらかしている。
3.Exceptionの利用が徹底している。
VC++にもtry~catchはある。あるが…Exceptionを返してくれるのは一部の意識高い人々が後年作った関数位。結局自分で戻り値を判定することになり、自分で投げて例外処理をまとめる位しか使いどころが無く。Javaで言うとOptionalみたいな感じ。機能はあるんだけれど一部の意識高い人々以外は使わないので今一つ有効に機能せず。
4.ログファイルがあてになる。
VC++、落ちる時はいきなりプロセスがOSに抹殺されるのでログをディスクにflushする間が無い。こまめにflushするとflushだらけになるし。でもまぁ標準出力はそこそこあてになる。
Javaは落ちると言ってもJVMが文句を言っているだけの事が多いし、前述のExceptionが徹底しているからFlushするチャンスも多い。
5.文字列の扱いが簡単
VC++、char*とかwchar_t*とかTCHARとかLPTSTRとかLPCTSTRとかstd:stringとかCStringとか文字列モノが多い。しかもAPIの引数の都合により割と頻繁に変換せざるを得ない。超面倒。しかも文字列とワイド文字列とマルチバイト文字列が別々にあり、あまつさえ最後のは環境依存。
Javaは兎に角全部UTF-16でStringだ。気にするのはI/Oの時だけだ。

ちなみにVC++の美点
1.__asmからのMMXの特に飽和加算命令が便利で速い(SSE以降は全く知らない。今はAVXと言うらしい)…が既に完全に忘れているので今は使える気がしない。
2.VC++製のWin32 DLLを呼び出すノウハウが豊富。
3.#ifdefはやっぱあると便利だわ。

今回はWin32のDLLを使いたいので使ったが、10年前に自分が作ったプログラムの改造なのに苦戦。Javaのぬるま湯ですっかり鈍っていたわ。
そういえばC#というのが、Javaのパチモンみたいな文法のぬるま湯でしかもWin32のDLLも割と簡単に呼び出せると聞く。が、今更移行も面倒だし。

Effective Java 第3版
柴田芳樹
丸善出版
2019-05-15