Java’da incompatible types: String cannot be converted to int hatası, metin türündeki bir değeri doğrudan bir tam sayı değişkenine atamaya çalıştığında ortaya çıkar. String değeri int değişkenine kendiliğinden atanamaz; metin geçerli bir tam sayıyı temsil ediyorsa Integer.parseInt() gibi bir yöntemle açıkça dönüştürülmesi gerekir.
Bu derleme hatası ne anlama gelir?

Bu hata, atamak istediğin değerin türü ile değişkenin türünün birbiriyle uyumlu olmadığını söyler. Tür, bir değerin nasıl kullanılacağını belirleyen özelliktir; örneğin String metni, int ise tam sayıyı temsil eder.
Java statik tür denetimi yapar: Derleyici, program çalışmadan önce değişkenlerin ve ifadelerin türlerini kontrol eder. Derleme hatası, kaynak kod çalıştırılabilir hâle getirilirken tespit edilen ve düzeltilmesi gereken bir sorundur.
Örneğin "5", içinde rakam bulunan bir String değeridir; 5 ise int türünde bir sayı değeridir. Görünüşleri benzer olsa da Java bunları aynı tür olarak kabul etmez.
Dönüşüm, bir türdeki değerden başka bir türde kullanılabilecek bir değer elde etme işlemidir. Integer.parseInt("5") ifadesi, geçerli tam sayı metninden 5 sayısını üretir; harf içeren veya int aralığı dışındaki metinler bu yöntemle geçerli bir sayıya dönüştürülemez.
Hata hangi durumlarda ortaya çıkar?
Bu hata, String üreten bir ifadeyi doğrudan int bekleyen bir değişkene atadığında ortaya çıkar. İfadenin metin olarak yazılması şart değildir; bir metot çağrısının sonucu da String olabilir.
Scanner ile okunan satırı int değişkenine atamak
Scanner nesnesinin nextLine() metodu, kullanıcı rakam yazsa bile girilen satırı String olarak döndürür. Bu nedenle scanner adlı bir nesnen varsa aşağıdaki atama derlenmez:
int yas = scanner.nextLine();
Derleyicinin hata mesajında şu ifade görülebilir; dosya adı, satır numarası ve mesajın sunuluşu kullanılan araca göre değişebilir. Geliştirme ortamları da aynı sorunu farklı ifadelerle gösterebilir.
error: incompatible types: String cannot be converted to int
Aşağıdaki konsol programı satırı önce metin olarak okur, ardından geçerli bir tam sayıya dönüştürür:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Yaşını gir: ");
String giris = scanner.nextLine();
int yas = Integer.parseInt(giris);
System.out.println("Girilen yaş: " + yas);
scanner.close();
}
}
Kullanıcı 16 girdiğinde programın ilgili çıktısı şöyledir:
Girilen yaş: 16
Girdi geçerli bir tam sayı değilse parseInt() çalışma sırasında NumberFormatException oluşturur. Bu durum, yukarıdaki tür uyuşmazlığından farklı olarak program çalışırken ortaya çıkar.
Metin birleştirme sonucunu sayı sanmak
Bir sayı ile metni + işaretiyle birleştirdiğinde sonuç metin olur. Örneğin aşağıdaki ifadede "5" bir String olduğu için sonuç sayı 8 değil, "53" metnidir:
String sonuc = "5" + 3;
System.out.println(sonuc);
Bu örneğin çıktısı 53 olur. Aynı ifadeyi int sonuc değişkenine atamaya çalışırsan tür uyuşmazlığı hatası alırsın; toplama yapmak için önce metni sayıya dönüştürmelisin.
Metodun dönüş türünü karıştırmak
Bir metodun adı ya da döndürdüğü metnin içeriği, dönüş türünü değiştirmez. Aşağıdaki metot rakamlardan oluşan bir değer üretse de dönüş türü String olarak tanımlanmıştır:
static String puanGetir() {
return "90";
}
// Bu atama derlenmez:
int puan = puanGetir();
Burada puanGetir() sonucunu önce bir String değişkeninde tutabilir veya metnin geçerli bir tam sayı olduğundan emin olduğunda dönüşüm uygulayabilirsin.
String değeri int türüne nasıl dönüştürülür?

Sayısal bir metni int türüne dönüştürmek için Integer.parseInt() kullanabilirsin. Örneğin "15" metni bu yöntemle 15 tam sayısına çevrilebilir.
String metin = "15";
int sayi = Integer.parseInt(metin);
System.out.println(sayi + 1);
Bu kodun çıktısı 16 olur. Dönüşümden dönen değeri sayi değişkenine atamak yerine Integer.parseInt(metin) + 1 ifadesinde olduğu gibi doğrudan da kullanabilirsin.
Integer.valueOf() ise int yerine Integer nesnesi döndürür. Java, otomatik kutu açma adı verilen işlemle bu nesnenin taşıdığı tam sayı değerini int değişkenine atamana olanak tanır:
String metin = "15";
Integer nesne = Integer.valueOf(metin);
int sayi = nesne;
System.out.println(sayi);
Bu örneğin çıktısı 15 olur. Buna karşılık (int) metin yazmak, String içeriğini sayıya dönüştürmez ve derleme hatasına yol açar.
Konsoldan alınan yaşı sayıya çevirme
Aşağıdaki program, yaşı önce String olarak okur ve geçerli bir tam sayı girildiğinde bir yıl sonraki yaşı hesaplar:
import java.util.Scanner;
public class YasHesapla {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Yaşını gir: ");
String metin = scanner.nextLine();
int yas = Integer.parseInt(metin);
System.out.println("Bir yıl sonraki yaşın: " + (yas + 1));
}
}
YasHesapla.java adıyla kaydedebileceğin bu programda örnek giriş ve çıktı şöyledir:
Yaşını gir: 15
Bir yıl sonraki yaşın: 16
Burada nextLine() metin döndürdüğü için toplama işleminden önce dönüşüm yapılır. Java'da değişkenler ve tür dönüşümleri üzerinde eğitmen desteğiyle çalışmak istersen Java birebir özel ders programını inceleyebilirsin.
Geçersiz metin ve ters dönüşüm nasıl ele alınır?
Sayısal biçime uymayan bir metni Integer.parseInt() ile çevirmeye çalıştığında NumberFormatException oluşabilir. Bu durum program çalışırken ortaya çıkar; try ve catch kullanarak kullanıcıya anlaşılır bir mesaj gösterebilirsin.
import java.util.Scanner;
public class SayiOku {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Bir tam sayı gir: ");
String metin = scanner.nextLine();
try {
int sayi = Integer.parseInt(metin);
System.out.println("Girdiğin sayı: " + sayi);
} catch (NumberFormatException hata) {
System.out.println("Geçerli bir tam sayı girmen gerekiyor.");
}
}
}
Örneğin kullanıcı merhaba girerse program Geçerli bir tam sayı girmen gerekiyor. mesajını gösterir. Sayısal görünen ancak int türünün değer aralığına sığmayan bir metin de aynı istisnaya yol açabilir.
int değerini String türüne çevirme
Tam sayıdan metne dönüşüm için String.valueOf() veya Integer.toString() kullanabilirsin:
int sayi = 15;
String ilkMetin = String.valueOf(sayi);
String ikinciMetin = Integer.toString(sayi);
System.out.println(ilkMetin + "1");
System.out.println(ikinciMetin + "1");
Her iki değişken de "15" metnini tutar. "1" de metin olduğu için örnekteki iki satırın çıktısı 151 olur; bu işlem sayısal toplama yerine metinleri birleştirir.
Sık Sorulan Sorular
Java'da tırnak içindeki "5" neden int olarak kullanılamaz?
Java'da "5" bir String metnidir, 5 ise bir tam sayı değeridir. Metin içindeki rakamla hesaplama yapmak için önce metni sayıya dönüştürmen gerekir.
Integer.parseInt() ile Integer.valueOf() arasındaki fark nedir?
Integer.parseInt() doğrudan int döndürürken Integer.valueOf() bir Integer nesnesi döndürür. Otomatik kutu açma sayesinde Integer değeri uygun durumda int olarak kullanılabilir.
Dönüşüm yaparken metnin tam sayı biçiminde ve int değer aralığında olmasına dikkat edebilirsin. Metne geri dönmek gerektiğinde ise String.valueOf() veya Integer.toString() kullanabilirsin.