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; } } }
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(表达式;表达式;表达式){ 循环体 }
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(条件表达式){ 语句 };
③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(条件表达式);
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");
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);
Dieser Code enthält jedoch einen zusätzlichen String, der nicht unbedingt erforderlich ist. Der bessere Code ist:
String s = "Text here";
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; } }
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;
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); }
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(); } }
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; }
Ä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 }
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(); } }
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!