これらの5つの最も可能性の高いコミットするエラー時にJavaを見て、あなたがたのですか?

人々は聖人ではない、実際には前に行うものではありません。セイJava言語はC ++に基づいて、簡単なプログラミング言語はC ++の機能の多くの複雑さを取り除く、進化しているが、それはJavaプログラマは何の間違った操作を行うことはできないことを保証するものではありません。だから、Javaプログラマの大多数のため、多少の誤差はそれが何であるかをコミットする可能性が最も高いですか?そして、これらのエラーはまた、多くの場合、あなたを作っているかどうかを見てみましょう!

図1に示すように、作られたホイールを繰り返します

明白な誤りは、Javaプログラマがすでに存在している習慣的なライブラリの多くを無視することです。あなたが車を構築することを決定した間に、私はあなたがすでにライブラリが存在するかどうかを確認するために検索しようと示唆しています。例えばに関し、logback、新しいlog4jの、ネットワーク、またはそこネッティーアッカを記録。ライブラリはJava8がジョダ時に追加のような、それは徐々に、標準となっている、があります。以下は、私の最後のプロジェクトの個人的な経験についてです。HTMLエスケープのためのコードの一部は、自分自身の開発者です。このコードは何年も動作しますが、再び無限ループにユーザーの入力コードに遭遇しました。サーバがハングアップするので、ユーザーは、その後、再びそれを再入力し、アプリケーションが応答しないこの死のサイクルを見つけます。これは、HTMLのエスケープツールを使用して開発されている場合は、Googleのグアバは、プロジェクトHtmlEscaperによって提供されるような、この深刻な問題が発生しないことがあります。そして今、市場で最も人気のあるオープンソースのデータベースは、このようなエラーは、時間内に修復することができ、チームとコミュニティサポートの背後にあります。

2は、スイッチ・ケースの誤差が壊れる使用、これは非常に厄介な問題ですが、それでも多くの場合、実際の開発に表示されます。滝の特性は、switch文に有用であることが、必要なブレークキーワード、時には悲惨な結果を欠いている可能性があります。たとえば、次のコードでは、ケース0であなたがブレークキーに置くことを忘れてしまった場合、コードがダウンし続け、それは出力ゼロの後に一つの意志:公共の静的な無効switchCasePrimer() {int型caseIndex = 0;スイッチ( caseIndex){ケース0:のSystem.out.println( "ゼロ");ケース1:のSystem.out.println( "1");休憩;ケース2:のSystem.out.println( "二");ブレーク;デフォルト:のSystem.out.println( "デフォルト"); }}

最善の解決策は、マルチステート、およびサブクラスに異なる処理コードを使用することです。もちろん、このエラーのようにFindBugsのかPMDのようなツールによってチェックアウトすることができます。

3は、リソースを解放するのを忘れて、あなたがファイルを開くと、またはネットワーク接続を確立するために、非常に重要な習慣は、リソースをオフにすることを忘れないことです。そして、この処理、例外処理などのリソースの使用中にエラーが発生した場合に、覚えているだけでなく、対応するシャットダウンを行う必要がなければなりません。一部は言うかもしれない、FileInputStreamのは、Javaターミネータ(ファイナライザ)が自動的にclose()メソッドを呼び出します、GC時間内のオブジェクトが、我々は、我々は我々がGCを実行する前に予測することはできませんので、GCは、どの時点で開始予測することはできないことを知って、意志どのように多くのリソースがタイムリーに閉じることができません。これを避けるために、試し-と資源構文のJava7の打ち上げは、すべての開発者の利用価値があります。プライベートの静的な無効printFileJava7は()IOExceptionをスローしながら(!データ= -1){System.out.print((; {トライ(FileInputStreamの入力=新しいFileInputStreamを( "file.txtは")){int型のデータを= input.read() CHAR)データ)、データ= input.read ();}}}

トライで資源構文は、インタフェースAutoClosableを実装するすべてのクラスに適用されます。これは、各リソースのタイムリーな閉鎖を確保することができます。

図4は、メモリリークが発生 Javaは自動メモリ管理を使用するため、ほとんどの時間を、私たちは、割り当て、空きメモリを気にするつもりはありませんが、それは、Java開発者はメモリを無視する必要が意味するものではありません。Javaアプリケーションでは、メモリの問題がしばしば発生します。私たちは、オブジェクトが参照されていない場合、オブジェクトが解放されることを知っているが、それはメモリリークの問題が表示されないことを意味するものではありません。Javaでは、そこにメモリリークの多くの原因がありますが、状況は解除できないオブジェクト参照に最も傾向があるオブジェクトはまだ他のオブジェクトによって参照されている場合、回復は、オブジェクト空間が回収されることはありませんGCヒープメモリ理由クラスは、コレクションに静的フィールドの参照を持っている場合、例えば、私たちは、その後、このコレクションとオブジェクトのこのコレクションは、永遠である彼は、nullに設定され、手動で使用した後、このコレクションを完了するために持っていない場合クラスの静的フィールドはGCではありませんので、それを回復することはないだろう。GCは、これらのオブジェクトが相互に参照するだけでなく、生き残るために必要かどうかを判断することはできませんので、例えば、オブジェクト参照の集合であること、お互いで、原因メモリリークことを理由に、我々は多くの場合、循環参照ので、循環参照することをそこに言います。JNIを使用する場合、別の場合には、それは、非ヒープメモリリークです。メモリリークの典型的な例:最終ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1 );最終のDeque番号=新しいLinkedBlockingDeque <>();最終のBigDecimal除数=新規のBigDecimal(51)。

scheduledExecutorService.scheduleAtFixedRate(() - > {BigDecimalの数= numbers.peekLast(); IF(数= NULL && number.remainder(除数).byteValue()== 0){するSystem.out.println( "番号:"! +数)のSystem.out.println( "のDequeサイズ:" + numbers.size());}}、10、10、TimeUnit.MILLISECONDS)。

scheduledExecutorService.scheduleAtFixedRate(() -> {
    numbers.add(new BigDecimal(System.currentTimeMillis()));
}, 10, 10, TimeUnit.MILLISECONDS);
复制代码

{scheduledExecutorService.awaitTermination(1、TimeUnit.DAYS)試みます。}キャッチ(InterruptedExceptionある電子){e.printStackTrace(); }

上記の例では、我々は2つのスケジュールされたタスクを作成します。最初のタスクのタイミングは、最終桁の「数字」両端キューから取得し、この数は51、数及び両端キューのプリントサイズで割り切れるとすることができるかどうかを判定する。2番目の正規のタスクは、両端キューにデータを追加し続けました。10msのは、両方のタスクを実行する間隔。このコードが実行されている場合は、両端キューのサイズは、両端キュー塗りつぶし全体のヒープ領域内のデータまで増加し続けることがわかります。方法はpollLastは、最後の要素の後に取得するために両端キューからこの要素を削除してしまうためこれを防ぐために、我々は、pollLastメソッドの代わりにpeekLastメソッドを使用することができます。

図5は、過度の廃棄物の発生データのゴミデータを意味の過剰産生、オブジェクトは、短い文のサイクルで実行されている多数のプログラムを生成することです。メモリからのGCの頻繁な実行、再利用スペースの結果は、GCヒープがスキャンを完了するために必要とされる実行この時間は、システムのパフォーマンスへの影響は非常に大きいです。以下は小さい例である:文字列oneMillionHello = "";のために (INT iは= 0; I <1000000; I ++){oneMillionHello = oneMillionHello + "こんにちは" ;!}のSystem.out.println(oneMillionHello.substring(0、6) );

Javaでは、文字列は不変ですので、各サイクルは、新しい文字列オブジェクトを作成します。このようなコードを改善するために、我々は、StringBuilderをするのではなく、使用することができます:StringBuilderのoneMillionHelloSB =新しいStringBuilderの();のため(int型私は= 0; I <1000000; I ++){oneMillionHelloSB.append( "こんにちは!");}のSystem.out。 println(oneMillionHelloSB.toString()(0、6)サブストリング。);

実装の過程でコードの2番目のバージョンでは、パフォーマンスの多くを発生させます。乾燥品は、ちょうどここでそれを終了する共有します!より乾燥した自由なリソースを取得したい、毎週のアップデートに注力することを続けてください!私と一緒に高度なDaguai!



おすすめ

転載: www.cnblogs.com/waiwei/p/12035561.html