Die häufigsten Java-Laufzeitfehler

Feb 27 2023
Laufzeitfehler treten auf, wenn ein Programm keine Syntaxfehler enthält, den Computer jedoch auffordert, etwas zu tun, was der Computer nicht zuverlässig ausführen kann. Während der Kompilierung verfügt der Compiler über keine Technik, um solche Fehler zu erkennen.

Laufzeitfehler treten auf, wenn ein Programm keine Syntaxfehler enthält, den Computer jedoch auffordert, etwas zu tun, was der Computer nicht zuverlässig ausführen kann . Während der Kompilierung verfügt der Compiler über keine Technik, um solche Fehler zu erkennen. Es ist die JVM (Java Virtual Machine), die es erkennt, während das Programm ausgeführt wird.

· StackOverflowError-Ausnahme
· OutOfMemoryError-Ausnahme
· NegativeArraySizeException
· ArithmeticException
· ArrayIndexOutOfBoundsException
· ArrayStoreException
· UnsupportedOperationException
· NoSuchElementException
· ClassCastException
· DateTimeException
· ConcurrentModificationException
· InputMismatchException
· IllegalFormatConversionException
· NumberFormatException
· InvalidParameterException
· NullPointerException

StackOverflowError-Ausnahme

StackOverflowError ist ein Fehler, den Java nicht abfangen kann, z. B. wenn der Stack nicht mehr genügend Speicherplatz hat, da es sich um einen der häufigsten Laufzeitfehler handelt , die auftreten können.

Die Hauptursache für den StackOverflowError besteht darin, dass wir unserer rekursiven Funktion oder Vorlage nicht die richtige Abschlussbedingung bereitgestellt haben , was bedeutet, dass sie zu einer Endlosschleife wird . Dieser Fehler wird also ausgegeben, wenn Java nicht mehr über den verfügbaren Speicher verfügt.

// Java program to demonstrate
// infinite recursion error
public class StackOverflowErrorClass {
 static int i = 0;
 // Method to print numbers
 public static int printNumber(int x)
 {
  i = i + 2;
  System.out.println(i);
  return i + printNumber(i + 2);
 }
 public static void main(String[] args)
 {
  // Recursive call without any
  // terminating condition
  StackOverflowErrorClass.printNumber(i);
 }
}

RunTime Error in java code :- Exception in thread “main” java.lang.StackOverflowError
at java.io.PrintStream.write(PrintStream.java:526)
at java.io.PrintStream.print(PrintStream.java:597)
at java.io.PrintStream.println(PrintStream.java:736)
at StackOverflowErrorClass.printNumber(StackOverflowErrorClass.java:13)
at StackOverflowErrorClass.printNumber(StackOverflowErrorClass.java:14)
at StackOverflowErrorClass.printNumber(StackOverflowErrorClass.java:14)
.
.
.

OutOfMemoryError-Ausnahme

Fehler wegen unzureichendem Speicherplatz/Speicher (java.lang.OutOfMemoryError) in Threads

Ein java.lang.OutOfMemoryError ist ein Laufzeitfehler in Java, der auftritt, wenn die Java Virtual Machine ( JVM ) aufgrund unzureichenden Speicherplatzes im Java-Heap kein Objekt zuordnen kann. Der Java Garbage Collector ( GC ) kann den für ein neues Objekt erforderlichen Speicherplatz nicht freigeben, was zu einem java.lang.OutOfMemoryError führt . Dieser Fehler kann auch ausgelöst werden, wenn der native Speicher nicht ausreicht, um das Laden einer Java-Klasse zu unterstützen.

Hier ist ein Beispiel für einen Fehler, der aufgrund unzureichenden Java-Heap-Speicherplatzes ausgelöst wird:

public class OutOfMemoryErrorExample {
    public static void main(String[] args) {
        Integer[] myArray = new Integer[1000 * 1000 * 1000];
    }
}

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at OutOfMemoryErrorExample.main(OutOfMemoryErrorExample.java:8)

NegativeArraySizeException

Die NegativeArraySizeException ist eine Laufzeitausnahme in Java, die auftritt, wenn eine Anwendung versucht, ein Array mit einer negativen Größe zu erstellen . Da es sich bei der NegativeArraySizeException um eine ungeprüfte Ausnahme handelt (erweitert RuntimeException ), muss sie nicht in der throws-Klausel einer Methode oder eines Konstruktors deklariert werden.

Entwickler müssen die Array-Größe auf eine positive Ganzzahl festlegen. Wenn ein Minuszeichen in die Array-Größendeklaration eingefügt wird, wird die NegativeArraySizeException ausgelöst.

class JavaError {
public static void main(String[] args) {
    int[] arr = new int[-5]; // Negative size of the array
    arr[8] = 89;
    System.out.println("Something went wrong!");
  }
}

java -cp /tmp/UDRgGsLLQ6 JavaError
Exception in thread "main" java.lang.NegativeArraySizeException: -5
at JavaError.main(JavaError.java:4)

ArithmeticException

ex. durch null Fehler dividieren

Datenmanipulation ist eine Hauptfunktion der meisten Java-Anwendungen. Wenn die Datenmanipulation eine Division umfasst, müssen Entwickler bei der Division durch Null vorsichtig sein . Wenn Null jemals der Nenner einer Berechnung wird, löst Java eine ArithmeticException aus. Wir können also nichts von Null dividieren. Wenn wir das versuchen, erhalten wir zur Laufzeit eine arithmetische Ausnahme.

class JavaError {
public static void main(String[] args) {
    int a = 23;
    int b = 0;
    System.out.println(a / b);
  }
}

java -cp /tmp/UDRgGsLLQ6 JavaError
Exception in thread "main" java.lang.ArithmeticException: / by zeroat JavaError.main(JavaError.java:7)

ArrayIndexOutOfBoundsException

wenn auf ein nicht vorhandenes Element in einem Array zugegriffen wird

Ein Array in Java erfordert eine festgelegte Größe. Wenn Sie versuchen, mehr Elemente hinzuzufügen, als das Array aufnehmen kann, führt dies zur ArrayIndexOutOfBoundsException . Der folgende Code versucht, ein Element zum Index acht eines Arrays hinzuzufügen, das so erstellt wurde, dass es nur fünf Elemente enthält:

Zugriff auf einen Array-Index, der nicht existiert:

class JavaError {
public static void main(String[] args) {
    String[] arr = new String[5];
    arr[6] = "Hi"; // Accessing array index that does not exsist
    System.out.println("Something went wrong!");
  }
}

java -cp /tmp/UDRgGsLLQ6 JavaError
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 6 out of bounds for length 5
at JavaError.main(JavaError.java:6)

Java wendet auf Elemente in einem Array eine auf Null basierende Zählung an, sodass sich Index 6 eines Arrays auf das siebte Element beziehen würde. Selbst der folgende Code würde in Java eine ArrayIndexOutOfBoundsException auslösen, da Index 4 eine Referenz auf das fünfte Element eines Arrays ist:

String[] arr = new String[5];
arr[5] = "Hi"; // Accessing array index that does not exsist

ArrayStoreException

Die ArrayStoreException weist Ähnlichkeiten mit der ClassCastException auf. Diese Java-Laufzeitausnahme tritt auf, wenn der falsche Objekttyp in einem Array platziert wird.

Im folgenden Beispiel wird ein BigInteger-Array erstellt, gefolgt von dem Versuch, ein Double hinzuzufügen. Das Double hat keine Beziehung zum BigInteger, daher löst dies zur Laufzeit eine ArrayStoreException aus.

Number[] bigInt = new BigInteger[5];
bigInt[0] = Double.valueOf(12345);

BigInteger[] bigInt = new BigInteger[5];
bigInt[0] = Double.valueOf(12345); // Java compile error

UnsupportedOperationException

Java-Programmierer verwenden häufig die Arrays-Klasse, um ein Java-Array in eine benutzerfreundlichere Liste umzuwandeln. Die von Java zurückgegebene Liste ist jedoch schreibgeschützt. Entwickler, die sich dieser Tatsache nicht bewusst sind und versuchen, neue Elemente hinzuzufügen, stoßen auf die UnsupportedOperationException. Dieses Beispiel zeigt, wie das passiert:

Integer[] data = {1,2,3,5,8,13,21};
List<Integer> list = Arrays.asList(data);
list.add(new Integer(0));

NoSuchElementException

Sie können nicht über einen leeren Iterator iterieren. Der folgende Code, der versucht, das nächste Element in einem leeren HashSet abzurufen, löst eine NoSuchElementException aus.

Set set = new HashSet();
set.iterator().next(); // Java runtime exception thrown

if (!set.isEmpty()) {
  set.iterator().next();
}

für Fehler bei der Datentypkonvertierung

Java ist eine stark typisierte Sprache. Es erzwingt strikt Typhierarchien und wandelt ein Objekt nicht in ein anderes um, es sei denn, die beiden teilen eine polymorphe Beziehung. ClassCastException tritt also auf, wenn Sie versuchen, ein Objekt fälschlicherweise in eine bestimmte Klasse umzuwandeln. Das bedeutet, dass Ihr Objekt keine Instanz oder Unterklasse dieser Klasse ist.

Im folgenden Code löst der Versuch, das Date-Objekt in einen Timestamp umzuwandeln, zur Laufzeit einen ClassCastException -Fehler aus.

Date today = new Date();Timestamp time = (Timestamp)today;

long seconds = System.currentTimeMillis();
Timestamp time = new Timestamp(seconds);
Date today = (Date)time; // this cast works

DateTimeException

Datenmanipulation ist ein heikles Unterfangen. Zeitzonen, Datumsgrenzen und inkonsistente Datumsformate können dazu führen, dass Java zur Laufzeit verschiedene DateTimeExceptions auslöst.

Beispielsweise wird der folgende Code kompiliert, aber das HourOfDay-Feld der LocalDate-Klasse führt dazu, dass der Versuch, das Datum zu formatieren, fehlschlägt.

LocalDate now = LocalDate.now();
DateTimeFormatter.RFC_1123_DATE_TIME.format(now);

LocalDate now = LocalDate.now();
DateTimeFormatter.ISO_DATE.format(now);

für falsch durchgeführte Parallelrechnungen

Die asList-Methode der Arrays-Klasse ist nicht das einzige Mal, dass eine Sammlung die schreibgeschützte Behandlung erfordert.

Wenn Sie eine Liste durchlaufen, muss die zugrunde liegende Sammlung repariert und nicht aktualisiert werden. Daher löst die Add-Methode im folgenden Codeausschnitt eine ConcurrentModificationException aus.

List servers = new ArrayList();
servers.add("Tomcat");
                   
Iterator<String> iterator = servers.iterator();
while (iterator.hasNext()) {
  String server = iterator.next();
  servers.add("Jetty");  // throws a Runtime Exception
}

InputMismatchException

Die InputMismatchException tritt im Allgemeinen auf, wenn mit Java-Programmen gearbeitet wird, die Benutzer mithilfe der Scanner- Klasse zur Eingabe auffordern. Diese Ausnahme wird im Allgemeinen während einer Benutzereingabe verursacht, wenn Sie eine bestimmte Art von Eingabe erwarten und der Benutzer eine andere Art von Eingabe eingibt. Mit anderen Worten: Diese Ausnahme kann auftreten, wenn die Eingabe für den erwarteten Typ ungültig ist. Die Eingabe stimmt entweder nicht mit dem Muster für den erwarteten Typ überein oder liegt außerhalb des zulässigen Bereichs.

Wie die Übergabe ungültiger Daten, z. B. die Übergabe eines numerischen Werts an das nicht numerische Feld. Wenn ein Programm beispielsweise einen Integer- Wert für eine Eingabe erwartet, der Benutzer jedoch stattdessen einen String- Wert eingibt, wird eine InputMismatchException ausgelöst.

Lösung : Wickeln Sie den Code, der Benutzereingaben anfordert, in eine While-Schleife ein, die den Benutzer kontinuierlich zur korrekten Eingabe auffordert.

IllegalFormatConversionException

Erläuterung : Dies hängt mit printf() und String.format() zusammen . Dies bedeutet, dass ein nicht zugeordneter Platzhalter vorhanden ist (zu viele Platzhalter, nicht genügend Argumente) oder dass es sich um den falschen Platzhalter für den Typ in den Argumenten handelt. Wenn beispielsweise %s ein Platzhalter für eine Ganzzahl ist, wird dieser Fehler ausgelöst.

Lösung : Stellen Sie sicher, dass die Anzahl der Platzhalter mit der Anzahl der Argumente übereinstimmt und dass die Platzhalter den richtigen Typ haben.

NumberFormatException

Es wird versucht, eine ungültige Zeichenfolge in eine Zahl umzuwandeln

Die NumberFormatException tritt auf, wenn versucht wird, eine Zeichenfolge mit falschem Format in einen numerischen Wert umzuwandeln. Das heißt, wenn es nicht möglich ist, einen String in einen beliebigen numerischen Typ (float, int usw.) zu konvertieren, wird diese Ausnahme ausgelöst. Es handelt sich um eine Laufzeitausnahme (ungeprüfte Ausnahme) in Java. Es ist eine Unterklasse der IllegalArgumentException- Klasse.

UngültigeParameterException

Übergabe ungültiger Parameter/Argumente an eine Methode

Diese Ausnahme ist eine Unterklasse von IllegalArgumentException , die für die Verwendung durch die JCA/JCE-Engine-Klassen konzipiert ist und ausgelöst wird, wenn ein ungültiger Parameter an eine Methode übergeben wird .

NullPointerException

Die NullPointerException ist eine sehr häufige RuntimeException, auf die Java-Anwendungen stoßen. Diese Ausnahme wird ausgelöst, wenn Java auf eine Nullreferenz stößt, obwohl es keine erwartet. und ein Java-Entwickler schreibt Code, der eine Methode für diese Referenz (nicht initialisiertes Objekt) aufruft.

String data = null;
System.out.println( data.length() ); // throws NullPointerException

Um diese RuntimeException in Ihren Java-Programmen zu vermeiden, initialisieren Sie jedes von Ihnen erstellte Objekt, bevor Sie es verwenden, und führen Sie eine Nullprüfung für jedes Objekt durch, das eine externe Bibliothek an Ihre Programme übergibt.

Unterstützen Sie unsere Publikation, indem Sie ihr folgen

Werfen Sie einen Blick auf Java-Laufzeitfehler. Maximieren Sie das Potenzial Ihres Teams: So halten Sie Ihr Software-Delivery-Team beschäftigt. Am häufigsten gestellte Frage im Interview mit Java8 Stream – Letzter Teil. So erstellen Sie ein einfaches Quarkus-Projekt mit Datenbankintegration. Was ist Ausnahmeverkettung in Java? Ausnahmebehandlung Ich verdiene 300 US-Dollar, indem ich in 2 Tagen ein Buch schreibe – hier erfahren Sie, wie Sie mit 10 einfachen, aber effektiven Möglichkeiten Ihre Lebensqualität verbessern. Erste Schritte mit Spring Boot: Ein umfassendes Tutorial für Anfänger