Heim > Java > JavaBase > Hauptteil

Einführung in mehrere häufige Fehler in Java

Freigeben: 2019-12-23 15:43:28
Original
4597 Leute haben es durchsucht

Einführung in mehrere häufige Fehler in Java

Häufige Java-Fehler:

1. Nullzeigerfehler

Bei der Verwendung von Java-Arrays ist es manchmal notwendig, die Elemente in zu ändern String-Array Vergleiche durchführen. Wenn das Element dann nicht null ist, wird das Programm normal ausgeführt. Sobald das verglichene Element jedoch null ist, tritt im Programm ein Nullzeigerfehler auf.

Lösung: Schutz hinzufügen und eine Beurteilung treffen, wenn das Element nicht null ist.

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;
    }
  }
}
Nach dem Login kopieren

2. Datengenauigkeitsbereich und Typkonvertierung

Es gibt 4 grundlegende Datentypen in Java:

Integer-Typ: -1 2 3 4 ……

Gleitkommatyp: float 1.3f; double 3.2 3.5d (nicht spezifizierter Typ, standardmäßig höchste Genauigkeit)

Zeichentyp: Unicode-Kodierung, 2 Bytes

Boolescher Typ: Die Genauigkeitsbereiche von Die vier Grundtypen von Daten, wahr und falsch

, sind unterschiedlich und werden Schritt für Schritt verbessert.

Wenn Sie bei der Verwendung von Datentypen nicht auf den Genauigkeitsbereich achten, kommt es zu einem Datenüberlauf, der zu Berechnungsfehlern führt.

Unter den vier Grundtypen können Ganzzahl-, Gleitkomma- und Zeichendaten ineinander konvertiert werden.

Die Konvertierungsregeln lauten wie folgt:

①Unsichtbare Konvertierung: Datenwerte mit geringer Genauigkeit werden Werten mit hoher Präzision zugewiesen und können automatisch konvertiert werden. (Low-Level zu High-Level)

②Erzwungene Konvertierung: Datenwerte mit großem Bereich, (High-Level zu Low-Level)

③Automatische Heraufstufungsregeln für den Betrieb: Während des Betriebs Es wird automatisch in einen hochpräzisen Datentyp konvertiert.

3. Die Verwendung von drei Arten von Schleifen

① für eine Schleife: Es handelt sich um eine Schleife mit einer begrenzten Anzahl von Schleifen. Vor der Schleife wird die Anzahl der Schleifen angegeben.

for(表达式;表达式;表达式){
        循环体
 }
Nach dem Login kopieren

break-Anweisung: Springen Sie nach der Ausführung sofort aus der Schleife, führen Sie nachfolgende Anweisungen nicht aus und beenden Sie alle Schleifen.

continue-Anweisung: Springen Sie nach der Ausführung sofort aus der aktuellen Wortschleife und beurteilen Sie erneut, ob die Bedingung weiterhin in der Schleife ausgeführt wird.

②While-Schleifenanweisung: geeignet für Schleifen mit unbekannter Häufigkeit.

while(条件表达式){
  语句
 };
Nach dem Login kopieren

③do-While-Schleife: Es ist auch eine Schleife mit unbekannter Häufigkeit. Die Anordnung muss mindestens einmal ausgeführt werden, bevor ein Urteil gefällt werden kann. Wenn while wahr ist, wird die Schleife fortgesetzt, andernfalls wird die Schleife beendet.

do {
 语句
 }while(条件表达式);
Nach dem Login kopieren

4. Zeichenfolge mehrmals kopieren

Ein Fehler, der durch Tests nicht gefunden werden kann, besteht darin, dass mehrere Kopien eines unveränderlichen Objekts generiert werden. Ein unveränderliches Objekt kann nicht geändert werden, daher besteht keine Notwendigkeit, es zu kopieren. Das am häufigsten verwendete unveränderliche Objekt ist String.

Wenn Sie den Inhalt eines String-Objekts ändern müssen, sollten Sie StringBuffer verwenden. Der folgende Code funktioniert einwandfrei:

String s = new String ("Text here");
Nach dem Login kopieren

Dieser Code weist jedoch eine schlechte Leistung auf und ist unnötig komplex. Sie können den obigen Code auch folgendermaßen umschreiben:

String temp = "Text here";
String s = new String (temp);
Nach dem Login kopieren

Dieser Code enthält jedoch einen zusätzlichen String, der nicht unbedingt erforderlich ist. Der bessere Code ist:

String s = "Text here";
Nach dem Login kopieren

5. Es gibt kein vom Klon zurückgegebenes Objekt (Klon)

Kapselung ist ein wichtiges Konzept in der objektorientierten Programmierung. Leider macht es Java leicht, die Kapselung versehentlich zu unterbrechen – Java ermöglicht es Ihnen, Verweise auf private Daten zurückzugeben. Der folgende Code verrät dies:

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;
  }
  }
Nach dem Login kopieren

Die Beispielklasse garantiert, dass die von ihr gespeicherten Höhen- und Breitenwerte immer nicht negativ sind. Der Versuch, die setValues()-Methode zum Festlegen negativer Werte zu verwenden, löst eine aus Ausnahme. Da getValues() leider eine Referenz auf d und keine Kopie von d zurückgibt, können Sie destruktiven Code wie diesen schreiben:

  Example ex = new Example();
  Dimension d = ex.getValues();
  d.height = -5;
  d.width = -10;
Nach dem Login kopieren

Jetzt hat das Beispielobjekt einen negativen Wert. Wenn der Aufruf von getValues()! Wenn der Benutzer niemals die Breiten- und Höhenwerte des zurückgegebenen Dimensionsobjekts festlegt, ist es unmöglich, solche Fehler allein durch Tests zu erkennen.

Leider kann der Clientcode im Laufe der Zeit den Wert des zurückgegebenen Dimensionsobjekts ändern. Derzeit ist die Ermittlung der Fehlerquelle mühsam und zeitaufwändig, insbesondere in einer Umgebung mit mehreren Threads.

Eine bessere Möglichkeit besteht darin, getValues() eine Kopie zurückgeben zu lassen:

  public synchronized Dimension getValues(){
  return new Dimension (d.x, d.y);
  }
Nach dem Login kopieren

6 Falsche Daten kopieren

Manchmal wissen Programmierer, dass sie eine Kopie zurückgeben müssen, aber nicht. t Achten Sie darauf, dass Sie keine falschen Daten kopieren. Da nur ein Teil der Datenkopierarbeit erledigt ist, weicht der folgende Code von der Absicht des Programmierers ab:

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();
  }
  }
Nach dem Login kopieren

Das Problem hierbei ist, dass die Methode getValues() nur das Array klont, nicht jedoch das enthaltene Dimension-Objekt im Array: Obwohl der Aufrufer das interne Array nicht so ändern kann, dass seine Elemente auf verschiedene Dimensionsobjekte verweisen, kann der Aufrufer den Inhalt der internen Array-Elemente (dh des Dimension-Objekts) ändern. Eine bessere Version der Methode getValues() ist:

 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;
  }
Nach dem Login kopieren

Ähnliche Fehler werden beim Klonen mehrdimensionaler Arrays atomarer Daten gemacht. Zu den Atomtypen gehören int, float usw. Ein einfacher Klon eines eindimensionalen Arrays vom Typ int ist korrekt, wie unten gezeigt:

 public void store (int[] data) throws CloneNotSupportedException{
  this.data = (int[])data.clone();
  // OK
  }
Nach dem Login kopieren

Das Kopieren eines zweidimensionalen Arrays vom Typ int ist komplizierter. Java verfügt nicht über ein zweidimensionales Array vom Typ int, daher ist ein zweidimensionales Array vom Typ int eigentlich ein eindimensionales Array: Sein Typ ist int[]. Das einfache Klonen eines Arrays vom Typ int[][] führt zu demselben Fehler wie bei der ersten Version der getValues()-Methode im obigen Beispiel, daher sollte dies vermieden werden. Das folgende Beispiel demonstriert die falschen und richtigen Methoden beim Klonen eines zweidimensionalen int-Arrays:

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();
  }
  }
Nach dem Login kopieren

Für weitere Java-Kenntnisse beachten Sie bitte die Spalte Java Basic Tutorial.

Das obige ist der detaillierte Inhalt vonEinführung in mehrere häufige Fehler in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!