Werfen Sie einen Blick auf Java-Laufzeitfehler

Feb 26 2023
Ein kurzer Überblick über die Java-Laufzeitfehler · Was sind Laufzeitfehler in Java? · Laufzeitfehler im Vergleich zu Kompilierungszeitfehlern · Arten von Laufzeitfehlern · Wie treten Laufzeitfehler auf? · Muss ich Laufzeitfehler auslösen · Was passiert, wenn Sie nicht Es gibt keine Laufzeitausnahmen. Beispiel für einen Laufzeitfehler. Was sind Laufzeitfehler in Java? Die Fehler, die zum Zeitpunkt der Programmausführung auftreten, werden als Laufzeitfehler bezeichnet. Diese Art von Fehlern kann zum Zeitpunkt der Kompilierung nicht erkannt werden, da ihre Syntax in Ordnung ist.

Ein kurzer Überblick über die Java-Laufzeitfehler

· Was sind Laufzeitfehler in Java?
· Laufzeitfehler vs. Kompilierzeitfehler
· Arten von Laufzeitfehlern
· Wie treten Laufzeitfehler auf?
· Muss ich Laufzeitfehler auslösen?
· Was passiert, wenn Sie keine Laufzeitausnahmen abfangen
? · Beispiel für einen Laufzeitfehler

Was sind Laufzeitfehler in Java?

Die Fehler, die zum Zeitpunkt der Programmausführung auftreten, werden als Laufzeitfehler bezeichnet. Diese Art von Fehlern kann zum Zeitpunkt der Kompilierung nicht erkannt werden, da ihre Syntax in Ordnung ist. Daher treten Laufzeitfehler auf, wenn das Programm erfolgreich kompiliert wurde, ohne dass Fehler aufgetreten sind und eine „.class“-Datei erstellt wurde. Das Programm wird jedoch nicht ordnungsgemäß ausgeführt. Diese Fehler werden zur Laufzeit oder zum Zeitpunkt der Ausführung des Programms erkannt.

Der Java-Compiler erkennt keine Laufzeitfehler, da der Java-Compiler über keine Technik zum Abfangen dieser Fehler verfügt, da ihm nicht alle Laufzeitinformationen zur Verfügung stehen. Laufzeitfehler werden von der Java Virtual Machine (JVM) abgefangen, wenn das Programm ausgeführt wird.

Diese Laufzeitfehler werden als Ausnahmen bezeichnet und beenden das Programm abnormal und geben eine Fehleranweisung aus.

Ausnahmen sind Fehler, die zur Laufzeit ausgelöst werden. Wir können Ausnahmebehandlungstechniken in Java verwenden , um diese Laufzeitfehler zu behandeln. Bei der Ausnahmebehandlung wird der Codeabschnitt, von dem der Programmierer glaubt, dass er den Fehler verursachen kann, in den Try-Block eingefügt, und der Programmierer kann den Fehler im Catch-Block abfangen.

Laufzeitfehler vs. Kompilierungszeitfehler

Ein Kompilierzeitfehler bezieht sich im Allgemeinen auf Fehler, die der Semantik oder Syntax entsprechen. Ein Laufzeitfehler bezieht sich auf den Fehler, der während der Codeausführung zur Laufzeit auftritt . Wir können einen Kompilierungsfehler während der Codeentwicklung leicht beheben. Ein Compiler kann einen Laufzeitfehler nicht identifizieren.

Erkennung

Compiler können Kompilierzeitfehler während der Entwicklung von Code leicht erkennen. Ein Compiler kann einen Laufzeitfehler nicht einfach erkennen. Daher müssen wir es während der Codeausführung identifizieren.

Referenz

Ein Kompilierzeitfehler bezieht sich im Allgemeinen auf Fehler, die der Semantik oder Syntax entsprechen. Ein Laufzeitfehler bezieht sich auf Fehler, die vom Compiler nicht erkannt werden, uns aber während der Codeausführung (zur Laufzeit) begegnen.

Auswirkung

Kompilierzeitfehler sind Semantik- oder Syntaxfehler . Sie verhindern die Ausführung (Kompilierung) des Codes, da einige Syntaxfehler erkannt werden. Wheares-Laufzeitfehler verhindern die vollständige Ausführung des Codes.

Fixierung

Wir können einen Kompilierzeitfehler während der Codeentwicklung leicht beheben. Ein Compiler kann einen Laufzeitfehler nicht identifizieren. Aber wir können das Problem beheben, nachdem der Code ausgeführt und zuvor identifiziert wurde.

Arten von Laufzeitfehlern

Es gibt mehrere Arten von Laufzeitfehlern, mit denen wir zum Zeitpunkt der Programmausführung konfrontiert werden können. Nachfolgend sind einige häufig auftretende Laufzeitfehler aufgeführt:

Dateneingabefehler: Eingabe-Ausgabe-Fehler

Es gibt unzählige Möglichkeiten, wie Benutzereingaben eine Anwendung beschädigen können.

Auf einem HTML-basierten Kommentar-Board kann ein Benutzer, der unschuldig ein uncodiertes Kleiner-als-Zeichen (<) oder ein Größer-als -Zeichen (>) einreichen darf, die Wiedergabefähigkeit dieser Webseite völlig ruinieren. Ebenso können Textverarbeitungssysteme, die alle Eingaben im ASCII-Format erwarten, vorzeitig beendet werden, wenn sie Emojis oder nicht standardmäßige Zeicheneingaben empfangen.

Noch schlimmer ist, dass ein beliebter Angriffsvektor von Hackern die SQL-Injection ist , die eine schädliche ausführbare Datenbankabfrage in einem ansonsten harmlosen Eingabefeld verbirgt. Dies kann nicht nur zum Ausfall einer Anwendung führen, sondern möglicherweise auch zum Verlust der Kontrolle über die gesamte Datenschicht.

Der Prozess der Eingabebereinigung oder Datenbereinigung wandelt das breite Spektrum an Daten, die möglicherweise in Anwendungen eingegeben werden könnten, in einen sicheren Wertebereich um, den ein Programm versteht. Die Verwendung solcher Bibliotheken trägt dazu bei, Laufzeitfehler zu verringern, die durch Fehler bei der Eingabebereinigung verursacht werden.

Beliebte Java-Frameworks wie Apache BVal und Hibernate Validator führen eine einfache, annotationsbasierte Eingabebereinigung durch und lassen sich problemlos in jede Java-basierte Anwendung integrieren.

Schlecht implementierte Logik

Nur weil Code kompiliert wird, heißt das nicht, dass er ordnungsgemäß funktioniert. Code enthält häufig logische Probleme, die dazu führen, dass eine Anwendung zur Laufzeit fehlschlägt.

Java enthält ein integriertes Konstrukt zur Behandlung einer Klasse häufiger Code-bezogener Laufzeitfehler, die sogenannte RuntimeException oder die ungeprüfte Ausnahme. Java 17 definiert allein im SDK 78 solcher Fehler, andere Projekte und Frameworks definieren zusätzlich ihre eigenen RuntimeException-Fehler.

  • RuntimeException
  • ArrayIndexOutOfBoundException
  • ConcurrentModificationException
  • ClassCastException
  • …

Zumindest sollte jede Anwendung über einen generischen Ausnahme-Kabelbaum verfügen, der jede mögliche RuntimeException abfängt, den Fehler protokolliert und den problematischen Ausführungsthread abbrechen lässt, anstatt die gesamte Anwendung abzubrechen.

Unzureichende Laufzeitressourcen

Softwareentwickler tragen nicht für jede Art von auftretenden Laufzeitfehlern die Schuld. Bei vielen Laufzeitfehlern in Java geht es um Ressourceneinschränkungen, die durch Probleme mit der zugrunde liegenden Infrastruktur verursacht werden. Beispiele hierfür sind: Netzwerk-Timeouts, nicht genügend Arbeitsspeicher , CPU-Überlastung oder die Unfähigkeit, einen Thread auf dem Prozessor zu planen.

Eine Möglichkeit, ressourcenbezogene Laufzeitfehler zu vermeiden, besteht darin, ein Lasttesttool wie JMeter oder LoadRunner in der CI/CD-Pipeline einer Anwendung zu verwenden. Wenn diese Tools ein mögliches Leistungsproblem erkennen, können sie die Anwendung stoppen, bevor sie sich weiter in der Pipeline in Richtung Produktionsbereitstellung bewegt.

Die Auslastung einiger Anwendungen variiert drastisch. Beispielsweise kann eine Finanzdienstleistungs-App die meiste Zeit über eine konstante Auslastung verzeichnen, am Ende des Handelstages jedoch extrem ausgelastet sein. Eine Steuerbehörde kann vor Ablauf der Einreichungsfrist eine Spitzenauslastung erreichen, für den Rest des Jahres jedoch relativ wenig Auslastung haben.

DevOps-Teams müssen ihre Leistungsmetriken mit Tools überwachen, um ressourcenbezogene Laufzeitfehler präventiv zu erkennen und zu mildern. Beispiele für solche Tools sind JDK Flight Recorder und Java Mission Control .

Für Anwendungen mit völlig unvorhersehbaren Arbeitslasten nutzen Sie cloudbasierte Lastausgleichstechnologie, um Ressourcen elastisch zuzuweisen. Dadurch entfällt sowohl die Unterbelegung von Ressourcen als auch die Falle, teure, selten genutzte Hardware zu kaufen.

Externe Ressourcenkonfiguration

Unternehmensanwendungen existieren selten in einer isolierten Blase. Sie interagieren typischerweise mit allem, von NoSQL-Datenbanken und relationalen Systemen bis hin zu Kafka-Warteschlangen und RESTful-APIs. Wenn Ihre Anwendung keine Verbindung zu einem erforderlichen externen System herstellen kann, führt dies leider zwangsläufig zu einem Laufzeitfehler.

Eine externe Ressource kann einen Laufzeitfehler auslösen, wenn eine der folgenden Situationen auftritt, ohne dass eine entsprechende Aktualisierung des aufrufenden Programms erfolgt:

  • eine IP-Adresse ändert sich;
  • Anmeldeinformationen ändern sich;
  • Änderung der Firewall-Konfiguration; oder
  • Das externe System fällt wegen Wartungsarbeiten aus.

Damit verbunden beenden Chaos-Engineering-Tools nach dem Zufallsprinzip die Prozesse, von denen eine Anwendung abhängt. Solche Tools zwingen Entwickler dazu, Code zu schreiben, der auch beim Ausfall externer Systeme reaktionsfähig und belastbar bleibt.

Das inhärente Problem mit externen Ressourcen besteht darin, dass Entwickler sie nicht kontrollieren können – sie können jedoch steuern, wie eine Anwendung reagiert, wenn diese externen Ressourcen ausfallen. Antizipieren Sie Laufzeitfehler, die von Systemen verursacht werden, die Sie nicht kontrollieren, und schreiben Sie Anwendungen, die ordnungsgemäß reagieren, wenn diese externen Systeme ausfallen.

Schwachstellen in Bibliotheken von Drittanbietern

Jede nicht triviale Unternehmensanwendung umfasst Dutzende Abhängigkeiten von Bibliotheken Dritter, um Funktionen wie Protokollierung, Überwachung, Eingabevalidierung, Formularverarbeitung und mehr auszuführen.

Leider führen alle Fehler in einer Bibliothek eines Drittanbieters zu einem Fehler in der von Ihnen bereitgestellten Anwendung. Dies wurde für die Java-Welt im Dezember 2021 unangenehm real, als ein LDAP-Inject-Fehler in der weit verbreiteten Log4j 2-Bibliothek JVMs auf der ganzen Welt dazu zwang, offline zu gehen.

Eine Möglichkeit, der Möglichkeit vorzubeugen, dass Softwareabhängigkeiten zu Laufzeitfehlern in Anwendungen führen, besteht darin, nur vertrauenswürdige Bibliotheken von Organisationen wie Apache oder Eclipse zu verwenden.

Eine weitere Schutzmaßnahme besteht darin, die Abhängigkeiten einer Anwendung regelmäßig auf die neueste Version zu aktualisieren, sobald Updates verfügbar sind.

Seien Sie sich schließlich der sekundären oder tertiären Abhängigkeiten bewusst – also derjenigen, auf denen Ihre primären Abhängigkeiten selbst beruhen – und seien Sie sich aller Risiken bewusst, die diese mit sich bringen.

In der Welt der Softwareentwicklung ist „perfekt“ der Feind von „erledigt“. Kein Programm ist vor der Gefahr eines unerwarteten Laufzeitfehlers gefeit. Wenn Unternehmensentwickler jedoch ihr Bewusstsein für die möglichen Ursachen schärfen und Maßnahmen zur Eindämmung potenzieller Bedrohungen ergreifen, können sie Software erstellen, die die Wahrscheinlichkeit eines Laufzeitfehlers minimiert.

Wie tritt ein Laufzeitfehler auf?

Glückwunsch! Wenn Ihre Eingabeaufforderung so aussieht:

Dann haben Sie Ihr Programm erfolgreich in Java-Bytecode kompiliert, was bedeutet, dass es keine syntaktischen Probleme mit Ihrem Code gab! Aber wie der Dateiname schon sagt, wenn wir dieses Programm ausführen:

Wir sind jetzt auf einen Laufzeitfehler gestoßen. Laufzeitfehler treten im Allgemeinen auf, wenn mit Ihrem Code etwas logisch nicht stimmt. In diesem Dokument wird erläutert, wie Laufzeitfehler gelesen und behoben werden.

Hier sind die Hauptteile des Laufzeitfehlers

Ausnahme im Thread „main“ : Dieser Teil erscheint bei den meisten Laufzeitfehlern. Es sagt Ihnen lediglich, dass die Ausnahme in der Hauptmethode aufgetreten ist, was ständig passieren sollte.

java.lang.ArrayIndexOutOfBoundsException: 5 : Dies ist der aufgetretene Fehler. Der Name des Fehlers gibt Ihnen im Allgemeinen eine Vorstellung davon, was passiert sein könnte. In diesem Fall wissen wir, dass es sich um Arrays und die Überschreitung des für ein Array vorgesehenen Speicherplatzes handelt.

at RunTimeErrors.main(RunTimeErrors.java:10) : Dies wird als Stack-Trace bezeichnet, der Ihnen die Liste der Methoden anzeigt, die ausgeführt wurden, als der Fehler auftrat.

  • RunTimeErrors.main teilt uns mit, dass dieser Fehler in der Hauptmethode der RunTimeErrors-Klasse aufgetreten ist.
  • RunTimeErrors.java:10 teilt uns mit, in welcher Datei dies passiert ist und in welcher Zeile es passiert ist. In diesem Fall geschah dies in unserer Hauptklasse in Zeile 10 .

Manchmal müssen Sie eine Prüfung durchführen, um zu entscheiden, ob eine Laufzeitausnahme ausgelöst werden soll, wenn das System dies nicht alleine tun kann, häufig, wenn Sie mit IllegalArgumentException arbeiten, aber meistens müssen Sie keine Prüfung durchführen, da dies Teil von ist die standardmäßige Laufzeitprüfung, die Java für Sie durchführt.

Nehmen wir als Beispiel NullPointerException :

if(t == null) 
 throw new NullPointerException();

if(t != null) {
  // work with t reference
}

Was passiert, wenn Sie keine Laufzeitausnahmen abfangen? Da der Compiler für diese keine Ausnahmespezifikationen erzwingt, ist es durchaus plausibel, dass eine RuntimeException bis zu Ihrer main( )-Methode durchsickern kann, ohne abgefangen zu werden. Um zu sehen, was in diesem Fall passiert, versuchen Sie das folgende Beispiel:

//: exceptions/NeverCaught.java 
// Ignoring RuntimeExceptions. 
// {ThrowsException} 
public class NeverCaught { 
 static void f() { 
 throw new RuntimeException("From f()"); 
 } 
 static void g() { 
 f(); 
 } 
 public static void main(String[] args) { 
 g(); 
 } 
} ///:~

Exception in thread "main" Java.lang.RuntimeException: From f() 
    at NeverCaught.f(NeverCaught.Java:7) 
    at NeverCaught.g(NeverCaught.Java:10) 
    at NeverCaught.main(NeverCaught.Java:13)

Beachten Sie, dass in Ihrer Codierung nur Ausnahmen vom Typ RuntimeException (und Unterklassen) ignoriert werden können, da der Compiler die Behandlung aller geprüften Ausnahmen sorgfältig erzwingt. Der Grund dafür ist, dass eine RuntimeException einen Programmierfehler darstellt, nämlich:

Ein Fehler, den Sie nicht vorhersehen können. Beispielsweise ein Nullverweis, der außerhalb Ihrer Kontrolle liegt.

Ein Fehler, den Sie als Programmierer in Ihrem Code hätten überprüfen sollen (z. B. ArraylndexOutOfBoundsException , bei dem Sie auf die Größe des Arrays hätten achten sollen). Eine Ausnahme, die ab Punkt 1 auftritt, wird häufig zu einem Problem für Punkt

Sie können sehen, was für ein enormer Vorteil es in diesem Fall ist, Ausnahmen zu haben, da sie beim Debugging-Prozess helfen.

Es ist interessant festzustellen, dass Sie die Java-Ausnahmebehandlung nicht als Einzwecktool klassifizieren können. Ja, es wurde entwickelt, um die lästigen Laufzeitfehler zu bewältigen, die aufgrund von Kräften auftreten, die außerhalb der Kontrolle Ihres Codes liegen, aber es ist auch wichtig für bestimmte Arten von Programmierfehlern, die der Compiler nicht erkennen kann.

Beispiel für einen Laufzeitfehler

public class Temp {
public static void main(String[] args) {
  Temp t = initT();
  
  t.foo("Hi");
  
 }
 private static Temp initT() {
  return null;
 }
 public void foo(String s) {
  System.out.println(s.toLowerCase());
 }
}

Exception in thread "main" java.lang.NullPointerException
	at Temp.main(Temp.java:7)

Es gibt eine ganze Gruppe von Ausnahmetypen, die in diese Kategorie fallen. Sie werden von Java immer automatisch ausgelöst und müssen nicht in Ihre Ausnahmespezifikationen aufgenommen werden. Praktischerweise werden sie alle gruppiert, indem sie einer einzigen Basisklasse namens RuntimeException zugeordnet werden. Dies ist ein perfektes Beispiel für Vererbung: Es wird eine Familie von Typen erstellt, die einige gemeinsame Merkmale und Verhaltensweisen aufweisen. Außerdem müssen Sie nie eine Ausnahmespezifikation schreiben, die besagt, dass eine Methode eine RuntimeException (oder einen beliebigen von RuntimeException geerbten Typ ) auslösen könnte, da es sich um ungeprüfte Ausnahmen handelt. Da sie auf Fehler hinweisen, fängt man normalerweise keine RuntimeException ab– es wird automatisch erledigt. Wenn Sie gezwungen wären, nach RuntimeExceptions zu suchen , könnte Ihr Code zu chaotisch werden. Auch wenn Sie RuntimeExceptions normalerweise nicht abfangen , können Sie in Ihren eigenen Paketen einige der RuntimeExceptions auslösen .

Siehe Die häufigsten Laufzeitausnahmen

Viel Spaß beim Lernen

Treten Sie der Mouad Oumous Java WhatsApp-Gruppe bei

Treten Sie dem Telegram-Kanal von Mouad Oumous bei

Unterstützen Sie unsere Publikation, indem Sie ihr folgen

GraphQL mit Spring Boot Die häufigsten Java-Laufzeitfehler Erste Schritte mit Spring Boot: Ein umfassendes Tutorial für Anfänger 10 einfache, aber effektive Möglichkeiten, Ihre Lebensqualität zu verbessern Am häufigsten gestellte Java8-Stream-basierte Interviewfrage – letzter Teil Ich verdiene 300 $, indem ich ein Buch schreibe in 2 Tagen – So funktioniert die Ausnahmeverkettung in Java | Ausnahmebehandlung So erstellen Sie ein einfaches Quarkus-Projekt mit Datenbankintegration