En Yaygın Java Çalışma Zamanı Hataları
Çalışma zamanı hataları, bir program herhangi bir sözdizimi hatası içermeyip bilgisayardan bilgisayarın güvenilir bir şekilde yapamayacağı bir şeyi yapmasını istediğinde ortaya çıkar . Derleme sırasında, derleyicinin bu tür hataları tespit edecek bir tekniği yoktur. Program çalışırken onu algılayan JVM'dir (Java Virtual Machine).
· StackOverflowError İstisnası
· OutOfMemoryError İstisnası
· NegativeArraySizeException
· ArithmeticException
· ArrayIndexOutOfBoundsException
· ArrayStoreException
· UnsupportedOperationException
· NoSuchElementException
· ClassCastException
· DateTimeException
· ConcurrentModificationException
· InputMismatchException
· IllegalFormatConversionException
· NumberFormatException
· In validParameterException · NullPointerException
StackOverflowError İstisnası
StackOverflowError , karşılaşılabilecek en yaygın çalışma zamanı hatalarından biri olduğu için Java'nın yakalamasına izin vermediği bir hatadır; örneğin, yığının yetersiz kalması .
StackOverflowError'ın ana nedeni, özyinelemeli işlevimize veya şablonumuza uygun sonlandırma koşulunu sağlamamış olmamızdır , bu da onun sonsuz bir döngüye dönüşeceği anlamına gelir . Bu nedenle, Java'nın kullanılabilir belleği bittiğinde bu hata atılır.
// 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 İstisnası
Dizilerde yetersiz alan/bellek hatası (java.lang.OutOfMemoryError)
Bir java.lang.OutOfMemoryError, Java Sanal Makinesi ( JVM ), Java yığınındaki yetersiz alan nedeniyle bir nesneyi ayıramadığında ortaya çıkan bir Java çalışma zamanı hatasıdır . Java Çöp Toplayıcı ( GC ), yeni bir nesne için gereken alanı boşaltamaz, bu da bir java.lang.OutOfMemoryError hatasına neden olur . Bu hata, yerel bellek bir Java sınıfının yüklenmesini desteklemek için yetersiz olduğunda da atılabilir.
Aşağıda, yetersiz Java öbek alanı nedeniyle fırlatılan bir örnek verilmiştir:
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
NegativeArraySizeException, Java'da bir uygulama negatif boyutlu bir dizi oluşturmaya çalıştığında ortaya çıkan bir çalışma zamanı istisnasıdır . NegativeArraySizeException denetlenmeyen bir istisna olduğundan ( RuntimeException öğesini genişletir ), bir yöntemin veya yapıcının throws yan tümcesinde bildirilmesi gerekmez.
Geliştiriciler, dizi boyutunu pozitif bir tamsayı olarak ayarlamalıdır. Dizi boyutu bildirimine bir eksi işareti girerse, bu, NegativeArraySizeException'ı fırlatır.
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)
Aritmetikİstisna
eski. sıfır hataya böl
Veri işleme, çoğu Java uygulamasının birincil işlevidir. Veri manipülasyonu bölmeyi içerdiğinde, geliştiriciler sıfıra bölme konusunda dikkatli olmalıdır . Sıfır, bir hesaplamada payda olursa, Java bir ArithmeticException atar. Yani hiçbir şeyi sıfırdan bölemiyoruz, bu yüzden bunu yapmaya çalıştığımızda çalışma zamanında bir aritmetik istisna alıyoruz.
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)
ArrayIndexOutOfBoundsİstisna
bir dizide var olmayan bir öğeye erişildiğinde
Java'daki bir dizi, ayarlanmış bir boyut gerektirir. Dizinin barındırabileceğinden daha fazla öğe eklemeye çalışırsanız, bu ArrayIndexOutOfBoundsException ile sonuçlanacaktır . Aşağıdaki kod, yalnızca beş öğe içerecek şekilde oluşturulmuş bir dizinin sekiz dizinine bir öğe eklemeye çalışır:
Var olmayan dizi dizinine erişme:
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, bir dizideki öğelere sıfıra dayalı sayma uygular, bu nedenle bir dizinin 6. dizini yedinci öğeye atıfta bulunur. Aşağıdaki kod bile Java'da bir ArrayIndexOutOfBoundsException tetikler, çünkü dizin 4 bir dizinin beşinci öğesine bir referanstır:
String[] arr = new String[5];
arr[5] = "Hi"; // Accessing array index that does not exsist
ArrayStoreException
ArrayStoreException, ClassCastException ile benzerlikler paylaşır. Bu Java çalışma zamanı istisnası, bir diziye yanlış türde nesne yerleştirildiğinde gerçekleşir.
Aşağıdaki örnekte, bir BigInteger dizisi oluşturulur ve ardından bir Double ekleme girişimi yapılır. Double, BigInteger ile bir ilişki paylaşmaz, dolayısıyla bu, çalışma zamanında bir ArrayStoreException tetikler.
Number[] bigInt = new BigInteger[5];
bigInt[0] = Double.valueOf(12345);
BigInteger[] bigInt = new BigInteger[5];
bigInt[0] = Double.valueOf(12345); // Java compile error
Desteklenmeyenİşlemİstisna
Java programcıları, bir Java dizisini daha kullanıcı dostu bir Listeye dönüştürmek için genellikle Arrays sınıfını kullanır. Ancak, Java'nın döndürdüğü Liste salt okunurdur. Bu gerçeğin farkında olmayan ve yeni öğeler eklemeye çalışan geliştiriciler, UnsupportedOperationException ile karşılaşır. Bu örnek, bunun nasıl olduğunu gösterir:
Integer[] data = {1,2,3,5,8,13,21};
List<Integer> list = Arrays.asList(data);
list.add(new Integer(0));
NoSuchElementException
Boş bir yineleyici aracılığıyla yineleme yapamazsınız. Bir sonraki öğeyi boş bir HashSet'te almaya çalışan aşağıdaki kod, bir NoSuchElementException fırlatır.
Set set = new HashSet();
set.iterator().next(); // Java runtime exception thrown
if (!set.isEmpty()) {
set.iterator().next();
}
veri türü dönüştürme hataları için
Java güçlü bir şekilde yazılan bir dildir. Tip hiyerarşilerini katı bir şekilde uygular ve polimorfik bir ilişkiyi paylaşmadıkça bir nesneyi diğerine atmaz. Dolayısıyla, bir nesneyi yanlış bir şekilde belirli bir sınıfa dönüştürmeye çalıştığınızda ClassCastException olur. Bu, nesnenizin bu sınıfın bir örneği veya alt sınıfı olmadığı anlamına gelir.
Aşağıdaki kodda, Date nesnesini bir Timestamp'a dönüştürme girişimi, çalışma zamanında bir ClassCastException hatası verir.
Date today = new Date();Timestamp time = (Timestamp)today;
long seconds = System.currentTimeMillis();
Timestamp time = new Timestamp(seconds);
Date today = (Date)time; // this cast works
DateTimeİstisna
Veri manipülasyonu zor bir çabadır. Zaman dilimleri, tarih çizgileri ve tutarsız tarih biçimleri, Java'nın çalışma zamanında çeşitli DateTimeExceptions oluşturmasına neden olabilir.
Örneğin, aşağıdaki kod derlenir, ancak LocalDate sınıfının HourOfDay alanı, tarihi biçimlendirme girişiminin başarısız olmasına neden olur.
LocalDate now = LocalDate.now();
DateTimeFormatter.RFC_1123_DATE_TIME.format(now);
LocalDate now = LocalDate.now();
DateTimeFormatter.ISO_DATE.format(now);
yanlış uygulanmış paralel hesaplamalar için
Diziler sınıfının asList yöntemi, bir koleksiyonun salt okunur muameleyi gerektirdiği tek zaman değildir.
Bir liste üzerinde yineleme yaptığınızda, temeldeki koleksiyon düzeltilmeli ve güncellenmemelidir. Bu nedenle, aşağıdaki kod parçacığındaki add yöntemi bir ConcurrentModificationException oluşturur.
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
}
Girdi Uyuşmazlığı İstisnası
InputMismatchException genellikle , Scanner sınıfını kullanarak kullanıcılardan girdi isteyen Java programlarıyla çalışırken ortaya çıkar . Bu istisna genellikle kullanıcı girişi sırasında, siz belirli bir türde girdi beklediğinizde ve kullanıcı farklı türde bir girdi girdiğinde ortaya çıkar. Başka bir deyişle, bu istisna, giriş beklenen tür için geçersiz olduğunda ortaya çıkabilir. Giriş, beklenen tür için kalıpla eşleşmiyor veya aralığın dışında.
Geçersiz verileri iletmek gibi, örneğin sayısal bir değeri sayısal olmayan alana geçirmek gibi. Örneğin, bir program bir girdi için bir Tamsayı değeri beklerse ancak kullanıcı bunun yerine bir Dize değeri girerse, bir InputMismatchException atılır.
Çözüm : Kullanıcıdan girdi isteyen kodu, kullanıcıdan sürekli olarak doğru girişi isteyen bir süre döngüsüne sarın.
Geçersiz BiçimDönüşümİstisna
Açıklama : Bu , printf() ve String.format() ile ilişkilidir . Bu, ilişkisiz bir yer tutucu olduğu (çok fazla yer tutucu, yeterli bağımsız değişken olmadığı) veya bağımsız değişkenlerdeki tür için yanlış yer tutucu olduğu anlamına gelir. Örneğin, bir tamsayı için yer tutucu olan bir %s bu hatayı verir.
Çözüm : Yer tutucu sayısının bağımsız değişken sayısıyla eşleştiğinden emin olun ve yer tutucuların doğru türde olduğundan emin olun.
SayıBiçimiİstisna
Geçersiz bir diziyi bir sayıya dönüştürmeye çalışmak
NumberFormatException , uygun olmayan biçime sahip bir dizeyi sayısal bir değere dönüştürmeye çalışıldığında oluşur. Bu, herhangi bir sayısal türdeki (float, int, vb.) bir dizeyi dönüştürmek mümkün olmadığında, bu istisnanın atıldığı anlamına gelir. Bu, Java'da bir Çalışma Zamanı İstisnasıdır (Denetlenmeyen İstisna). IllegalArgumentException sınıfının bir alt sınıfıdır .
GeçersizParametreİstisnası
Bir yönteme geçersiz parametreler/argümanlar geçirme
JCA/JCE motor sınıfları tarafından kullanılmak üzere tasarlanmış bir IllegalArgumentException alt sınıfı olan bu istisna, bir yönteme geçersiz bir parametre iletildiğinde atılır .
NullPointerİstisna
NullPointerException, Java uygulamalarının karşılaştığı çok yaygın bir RuntimeException'dır. bu istisna, Java beklemediği halde boş bir referansla karşılaştığında atılır. ve bir java geliştiricisi bu referansta (başlatılmamış nesne) bir yöntemi çağıran kod yazar.
String data = null;
System.out.println( data.length() ); // throws NullPointerException
Java programlarınızda bu RuntimeException'dan kaçınmak için , oluşturduğunuz her nesneyi kullanmadan önce başlatın ve harici bir kitaplığın programlarınıza ilettiği herhangi bir nesne üzerinde boş bir denetim gerçekleştirin.
Yayınımızı takip ederek destek olun
Ekibinizin Potansiyelini En Üst Düzeye Çıkaran Java Çalışma Zamanı Hatalarına Bir Göz Atın : Yazılım Dağıtım Ekibinizi Nasıl Meşgul Tutun En Sık Sorulan Java8 Akışına Dayalı Mülakat Sorusu — Son Bölüm Veritabanı Entegrasyonu ile Basit Bir Quarkus Projesi Nasıl Oluşturulur Java'da İstisna Zincirleme Nedir | İstisna İşlemleri 2 Günde Bir Kitap Yazarak 300 Dolar Kazanıyorum — İşte Yaşam Kalitenizi Artırmanın 10 Basit Ama Etkili Yolu Spring Boot'a Başlarken: Yeni Başlayanlar İçin Kapsamlı Bir Eğitim
![Bağlantılı Liste Nedir? [Bölüm 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































