Önce Derle, Sonra Çalıştır
Artık bir JDK kurduğunuza göre, Java'yı çalıştırmak iki adımlı bir döngüdür. Bir betik dilinde olduğu gibi yorumlayıcıyı bir dosyaya yöneltip işi bitirmek yerine, Java önce insan tarafından okunabilir kaynağınızı bytecode'a derler, ardından ayrı bir adım o bytecode'u JVM üzerinde çalıştırır.
Bu iki adım, JDK ile birlikte gelen iki komut satırı aracına karşılık gelir:
javac- derleyici.Main.java'yı okur veMain.class(bytecode) yazar.java- başlatıcı. JVM'yi başlatır veMain.class'taki bytecode'u çalıştırır.
Kendi kendine yeten herhangi bir örneği tam burada, sayfada çalıştırabilirsiniz - aşağıdaki düzenleyici iki adımı da sizin için yapar. Ancak kendi makinenizde neler olduğunu anlamanız faydalı olur, çünkü gerçek projeler orada yaşar.
Makinenizdeki İki Komut
Diyelim ki bu kodu Main.java olarak kaydettiniz:
public class Main {
public static void main(String[] args) {
System.out.println("Hello from the terminal");
}
}
Dosyayı içeren klasörde bir terminal açın ve derleyiciyi çalıştırın:
javac Main.java
Kod sorunsuz derlenirse, javac hiçbir şey yazdırmaz ve kaynağınızın yanında Main.class adlı yeni bir dosya oluşturur. Bu .class dosyası bytecode'tur - okunabilir metin değildir ve işletim sisteminize bağlı değildir.
Şimdi onu java komutuyla başlatın:
java Main
Hello from the terminal
Yeni başlayanların en sık yaptığı hata burada: programı başlatmak için javac değil java çalıştırırsınız ve sınıf adını uzantısız verirsiniz. java Main olur - asla java Main.class veya java Main.java değil.
Dosya Adı Public Sınıfla Eşleşmelidir
Java, yeni gelenleri şaşırtan bir kural dayatır: bir public sınıf, tam olarak aynı ada artı .java uzantısına sahip bir dosyada yer almalıdır. Bir public class Main, Main.java içinde olmalıdır. Büyük-küçük harfi yanlış yapın, javac derlemeyi reddeder.
// This is in a file called Greeting.java
public class Greeting { // ERROR: class Greeting should be in Greeting.java... wait, it is
public static void main(String[] args) {
System.out.println("Hi");
}
}
İnsanları gerçekten zorlayan uyumsuzluk daha incedir - dosyayı greeting.java (küçük harf) olarak adlandırmak ama sınıfın Greeting olması ya da Main.java kaydedip içine public class Hello yazmak. Derleyici şuna benzer bir şey bildirir:
Main.java:1: error: class Hello is public, should be declared in a file named Hello.java
Çözüm her zaman aynıdır: dosya adı ile public sınıf adını harf harf birebir aynı yapın.
Kısayol: Tek Bir Dosyayı Doğrudan Çalıştırma
JDK 11'den beri, tek bir kaynak dosya için açık derleme adımını atlayabilirsiniz. java komutu onu bellekte derler ve tek seferde çalıştırır - diske hiçbir .class dosyası yazılmaz:
java Main.java
Bu, hızlı denemeler ve küçük betikler için mükemmeldir. Verdiğiniz şeydeki farka dikkat edin:
java Main- zaten derlenmiş birMain.class'ı çalıştırır.java Main.java- kaynak dosyayı tek seferde derler ve çalıştırır.
Tek dosya modu yalnızca tüm programınız tek bir dosyaya sığdığında çalışır. Kodu birkaç dosyadaki birkaç sınıfa böldüğünüz anda, yine önce javac ile derlemeye dönersiniz. Temelleri öğrenirken, tek dosya modu döngüyü kısa tutar.
Programınıza Argüman Geçirme
main içindeki String[] args'ı hatırlıyor musunuz? Bunlar komut satırı argümanlarıdır. java komutunda sınıf adından sonra yazdığınız her şey o diziye düşer:
Kendi makinenizde ona şöyle argüman beslerdiniz:
java Main hello world
First argument: hello
Total arguments: 2
Yukarıdaki düzenleyici terminal argümanları alamadığından "argüman yok" dalını çalıştırır - ama aynı kod her iki durumu da işler. Java programlarının, dosyalara veya kullanıcı girdisine ulaşmadan çok önce, başlatma anında geçirilen girdiyi okuma şekli budur.
Derleyicinin Hata Mesajlarını Okuma
javac kodunuzu reddettiğinde, size dosyayı, satırı ve neyin yanlış gittiğini söyler. Bu mesajları okumayı öğrenmek, çıkmazdan kurtulmanın yarısıdır. İşte klasik bir örnek - eksik bir noktalı virgül:
public class Main {
public static void main(String[] args) {
System.out.println("Oops") // no semicolon
}
}
Main.java:3: error: ';' expected
System.out.println("Oops")
^
1 error
Şapka işareti (^), derleyicinin bir şey beklediği yeri gösterir. Main.java:3 dosya ve satır numarasıdır. Tahmin etme dürtüsüne direnin - satırı okuyun, adını verdiği tek şeyi düzeltin ve yeniden derleyin. Derleme hataları henüz hiçbir şeyin çalışmadığı anlamına gelir; çalışma zamanı hataları (farklı görünürler) programınızın başladığı ve ardından başarısız olduğu anlamına gelir.
Bir Sağlama Programı
Bunu düzenleyicide çalıştırın veya Main.java olarak kaydedip kendi makinenizde javac Main.java ardından java Main yapın. Üç satırı da görüyorsanız, araç zinciriniz uçtan uca çalışıyor demektir:
Burada yakında düzgünce tanışacağınız üç şey görünüyor: bir int değişkeni, + ile dize birleştirme ve .length'i olan bir dizi. Şimdilik programın derlenip yazdırması yeterli.
Sonraki: Java Sözdizimi
Birkaç program çalıştırdınız, ama noktalama işaretlerinin üzerinden el yordamıyla geçtik - süslü parantezler, noktalı virgüller, public static void main ve her satırın neden göründüğü gibi göründüğü. Sonraki sayfa, yapının kalıplaşmış kod gibi hissettirmeyi bırakıp anlam kazanması için Java'nın sözdizimini parça parça çözümlüyor.
Sıkça Sorulan Sorular
Bir Java programını nasıl çalıştırırım?
Kodunuzu public sınıfla aynı ada sahip bir dosyaya kaydedin (örneğin Main.java), o klasörde bir terminal açın ve iki komut çalıştırın: bytecode'a derlemek için javac Main.java, ardından çalıştırmak için java Main. JDK 11 veya daha yeni bir sürümle, tek bir dosya için ilk adımı atlayıp doğrudan java Main.java çalıştırabilirsiniz.
javac ile java arasındaki fark nedir?
javac derleyicidir: .java kaynağınızı okur ve bytecode dolu bir .class dosyası üretir. java ise başlatıcıdır: JVM'yi başlatır ve bir .class dosyasındaki bytecode'u çalıştırır. javac ile bir kez derlersiniz, sonra java ile istediğiniz kadar çalıştırırsınız.
Neden "could not find or load main class" hatası alıyorum?
Neredeyse her zaman java'ya yanlış ad verdiğiniz içindir. Dosya adını değil, sınıf adını kullanın: java Main olur, java Main.class veya java Main.java değil. Ayrıca Main.class dosyasını içeren klasörde olduğunuzdan ve sınıf adının, büyük-küçük harf dahil, dosya adıyla tam olarak eşleştiğinden emin olun.