ホームページ Java &#&ベース Java でよくあるいくつかのエラーの紹介

Java でよくあるいくつかのエラーの紹介

Dec 23, 2019 pm 03:43 PM
java

Java でよくあるいくつかのエラーの紹介

一般的な Java エラー:

1. Null ポインター エラー

Java 配列の使用では、配列内の要素を変更する必要がある場合があります。文字列配列の比較。要素が null でない場合、プログラムは正常に実行されますが、比較された要素が null になると、プログラム内で null ポインタ エラーが発生します。

解決策: 保護を追加し、要素が null でない場合に判定を行います。

public static void main(Sring[] args){
  String [] sums = "adfafA";
  for(int i=0;i<sums.length;i++){
    if(sums[]!=null && sums[i].equals(sr)){
      System.out.println("找到元素"+sums[i]);
      break;
    }
  }
}
ログイン後にコピー

2. データ精度範囲と型変換

Java には 4 つの基本的なデータ型があります:

整数型: -1 2 3 4 ……

浮動小数点型: float 1.3f; double 3.2 3.5d (未指定型、デフォルトの最高精度)

文字型: Unicode エンコード、2 バイト

ブール型: の精度範囲true と false

という 4 つの基本的なデータ タイプは異なり、段階的に改良されています。

データ型を使用する際に精度の範囲に注意しないと、データのオーバーフローが発生し、計算エラーが発生します。

4 つの基本型のうち、整数、浮動小数点、および文字データは相互に変換できます。

変換ルールは以下のとおりです。

①目に見えない変換:精度の低いデータ値を精度の高い値に代入し、自動的に変換できます。 (下位から上位へ)

②強制変換:範囲の広いデータ値、(上位から下位へ)

③運用自動昇格ルール:運用中、これは自動的に高精度のデータ型に変換されます。

3. 3種類のループの使い方

①forループ: 回数制限のあるループであり、ループの前にループ回数を指定します。

for(表达式;表达式;表达式){
        循环体
 }
ログイン後にコピー

break ステートメント: 実行後、すぐにループから抜け出し、後続のステートメントを実行せず、すべてのループを終了します。

continue 文: 実行後、直ちに現在のワードループから抜け出し、条件がループ継続するかどうかを再判定します。

②while ループ文: 回数が不明なループに適しています。

while(条件表达式){
  语句
 };
ログイン後にコピー

③do-while ループ: これも回数不明のループです。注文は判断を下す前に少なくとも 1 回執行される必要があります。 while が true の場合はループを継続し、そうでない場合はループを終了します。

do {
 语句
 }while(条件表达式);
ログイン後にコピー

4. 文字列を複数回コピーします

テストでは発見できないエラーが、不変オブジェクトのコピーを複数生成しています。不変オブジェクトは変更できないため、コピーする必要はありません。最も一般的に使用される不変オブジェクトは String です。

String オブジェクトの内容を変更する必要がある場合は、StringBuffer を使用する必要があります。次のコードは正常に動作します:

String s = new String ("Text here");
ログイン後にコピー

ただし、このコードはパフォーマンスが低く、必要以上に複雑です。上記のコードを次のように書き直すこともできます:

String temp = "Text here";
String s = new String (temp);
ログイン後にコピー

ただし、このコードには追加の文字列が含まれていますが、これは完全には必要ではありません。より良いコードは次のとおりです:

String s = "Text here";
ログイン後にコピー

5. クローンによって返されるオブジェクトはありません。

カプセル化は、オブジェクト指向プログラミングにおける重要な概念です。残念ながら、Java ではカプセル化が誤って破られやすくなっています。Java ではプライベート データへの参照を返すことができます。次のコードはこれを明らかにします:

import java.awt.Dimension;
  /***Example class.The x and y values should never*be negative.*/
  public class Example{
  private Dimension d = new Dimension (0, 0);
  public Example (){ }
  /*** Set height and width. Both height and width must be nonnegative * or an exception is thrown.*/
  public synchronized void setValues (int height,int width) throws IllegalArgumentException{
  if (height <0 || width <0)
  throw new IllegalArgumentException();
  d.height = height;
  d.width = width;
  }
  public synchronized Dimension getValues(){
  // Ooops! Breaks encapsulation
  return d;
  }
  }
ログイン後にコピー

サンプル クラスは、格納される高さと幅の値が常に非負であることを保証します。setValues() メソッドを使用して負の値を設定しようとすると、例外。残念ながら、getValues() は d のコピーではなく d への参照を返すため、次のような破壊的なコードを書くことができます:

  Example ex = new Example();
  Dimension d = ex.getValues();
  d.height = -5;
  d.width = -10;
ログイン後にコピー

Now, Example オブジェクトには負の値があります! getValues() への呼び出しがユーザーが返された Dimension オブジェクトの幅と高さの値を設定しない場合、テストだけでそのようなエラーを検出することは不可能です。

残念ながら、時間の経過とともに、クライアント コードによって返された Dimension オブジェクトの値が変更される可能性があります。現時点では、特にマルチスレッド環境では、エラーの原因を追跡するのは面倒で時間がかかります。

より良い方法は、getValues() にコピーを返させることです:

  public synchronized Dimension getValues(){
  return new Dimension (d.x, d.y);
  }
ログイン後にコピー

6. 間違ったデータをコピーします

プログラマーはコピーを返さなければならないことを知っていても、間違ったデータをコピーしないように注意してください。データ コピー作業の一部しか行われていないため、次のコードはプログラマの意図から逸脱しています:

import java.awt.Dimension;
  /*** Example class. The height and width values should never * be
  negative. */
  public class Example{
  static final public int TOTAL_VALUES = 10;
  private Dimension[] d = new Dimension[TOTAL_VALUES];
  public Example (){ }
  /*** Set height and width. Both height and width must be nonnegative * or an exception will be thrown. */
  public synchronized void setValues (int index, int height, int width) throws IllegalArgumentException{
  if (height <0 || width <0)
  throw new IllegalArgumentException();
  if (d[index] == null)
  d[index] = new Dimension();
  d[index].height = height;
  d[index].width = width;
  }
  public synchronized Dimension[] getValues()
  throws CloneNotSupportedException{
  return (Dimension[])d.clone();
  }
  }
ログイン後にコピー

ここでの問題は、getValues() メソッドが配列の複製のみを作成し、Dimension オブジェクトの複製を作成しないことです。したがって、呼び出し元は、内部配列の要素が別の Dimension オブジェクトを指すように内部配列を変更することはできませんが、内部配列要素 (つまり、Dimension オブジェクト) の内容を変更することはできます。 getValues() メソッドのより良いバージョンは次のとおりです。

 public synchronized Dimension[] getValues() throws CloneNotSupportedException{
  Dimension[] copy = (Dimension[])d.clone();
  for (int i = 0; i
  // NOTE: Dimension isn’t cloneable.
  if (d != null)
  copy[i] = new Dimension (d[i].height, d[i].width);
  }
  return copy;
  }
ログイン後にコピー

アトミック型データの多次元配列を複製するときにも、同様の間違いが発生します。アトミック タイプには、int、float などが含まれます。以下に示すように、単純に int 型の 1 次元配列を複製するのは正しいことです。

 public void store (int[] data) throws CloneNotSupportedException{
  this.data = (int[])data.clone();
  // OK
  }
ログイン後にコピー

int 型の 2 次元配列のコピーはより複雑です。 Java には int 型の 2 次元配列がないため、int 型の 2 次元配列は実際には 1 次元配列であり、その型は int[] です。 int[][] 型の配列を単純に複製すると、上記の例の getValues() メソッドの最初のバージョンと同じ間違いが発生するため、これは避けるべきです。次の例は、2 次元 int 配列を複製するときの間違ったメソッドと正しいメソッドを示しています。

public void wrongStore (int[][] data) throws CloneNotSupportedException{
  this.data = (int[][])data.clone(); // Not OK!
  }
  public void rightStore (int[][] data){
  // OK!
  this.data = (int[][])data.clone();
  for (int i = 0; i
  if (data != null)
  this.data[i] = (int[])data[i].clone();
  }
  }
ログイン後にコピー

Java の詳細については、「java Basic Tutorial」列に注目してください。

以上がJava でよくあるいくつかのエラーの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

See all articles