Javaに対する批判
"Write once, run anywhere"(WORA、一度書けばどこでも動く)という言葉があるとおり、Javaの目標の一つにプラットフォーム非依存があげられる。JavaコンパイラはJava仮想マシン用の中間言語(Javaバイトコード)を生成する。コンパイルされたJavaのプログラムは、Java仮想マシンを実行環境として動作する。この仮想マシンがハードウェア間の差異を吸収することで、プラットフォーム非依存を実現している。ただし、現時点では一部にプラットフォーム依存の部分があり、完全なプラットフォーム非依存ではない。
また、マルチプラットフォームにするということは、一部のプラットフォームにしかない独自の機能はJavaから使えないことを意味する。 例えばWindows用のマルチメディアAPIであるDirectXや、3DグラフィックスAPIであるDirect3DはJavaから直接呼び出すことはできない。そのため、橋渡しをするための拡張APIが提供されている。
またJavaではバージョン間の前方互換性・後方互換性の問題が議論の対象になっている。Javaではバージョン間の互換性をある程度の水準まで達成している。
Javaに対する批判(ジャバにたいするひはん)では、プログラミング言語Javaと、その主たる実装であるJDKやその他の実装に関する批判、およびJavaプラットフォームの性能に対する批判について説明する。Javaプラットフォームの性能に関する、批判以外の内容については「Javaの性能」を参照のこと。
Javaは優れた技術だと評価する人々がいる一方で批判も少なくない。Javaはソフトウェアに関する複雑さを管理する問題に対して革新的な方法を提供するという目標のもとで開発された(ないし、そのように信じられている)。多くの人々は、Java技術はこの期待に対して満足できる答えを提供したと評価している。
しかしJavaにも欠点が無いわけではないし、どのようなプログラミング作法にも適応しているというわけでもない。また、どのような環境や要件にも普遍的に適応しているというわけでもない。
ソースコードレベルでのプログラミングパラダイムの追加や記述性の改善を求めて、Java仮想マシン (JVM) 上で動作するScalaやKotlinといった後発言語も出現しているが、JVMベースの互換言語であるがゆえに、JVMに存在する制約もまた残されている。
Javaの浮動小数点演算は主にIEEE 754(二進化浮動小数点数演算標準)をベースとしているが、例えばIEEE 754に必須とされる例外フラグや方向指定の丸めなどの、いくつかの機能については"strictfp"修飾子を指定した場合でもサポートされない。Javaの仕様として知られているものはJava自体の問題ではないが、浮動小数点数演算を行う上で避けて通れない問題である。