Java'da printStackTrace () yönteminin kullanımı nedir?


99

Bir soket programından geçiyorum. İçinde , catch bloğundaki nesneye printStackTraceçağrılır IOException. Aslında
ne yapıyor printStackTrace()?

catch(IOException ioe)
{
    ioe.printStackTrace();
}

Amacının farkında değilim. Ne için kullanılır?


47
Modern IDE'lerin en güçlü özelliklerinden biri, belirli bir Java yöntemi için belgelere (javadoc denir) bakma yeteneğidir. Eclipse'de, imleç printStackTrace yöntem adına yerleştirildiğinde Shift-F2'dir.
Thorbjørn Ravn Andersen

2
Java'da yenisiniz gibi görünüyor. İşte okumak için bir şey: today.java.net/article/2006/04/04/...
TJR

Tam olarak ne yaptığını ve nasıl yaptığını görmek için printStackTrace () kodunu da okuyabilirsiniz.
Peter Lawrey

1
Bu modeli sık sık yakalama bloklarının içinde görüyorum: e.printStackTrace(); System.exit(1); Burada OP ile aynı soruyu sormak istiyorum, ancak farklı bir şekilde: Bunun amacı tam olarak nedir? JRE, istisna oluştuğunda yığın izini otomatik olarak yazdırıp çıkmayacak mı? Yani, burada gerçekten çok fazla "İstisna İşlemi" yok, değil mi?
Owen

1
Ayrıca , istisnayı bastırdığı için de genellikle çok kötü bir fikirdir - ne yazık ki Eclipse ve diğer IDE'lerin otomatik olarak yakalama bloğu gövdesi olarak önerdiği şeydir, bu yüzden olması gerekenden çok daha sık kullanılır .
dimo414

Yanıtlar:


100

Bu, Exceptionörneğin yığın izlemesini yazdıranSystem.err örnekler üzerinde bir yöntemdir .

Bir istisnayı teşhis etmek için çok basit ama çok kullanışlı bir araçtır. Size ne olduğunu ve bunun kodun neresinde olduğunu anlatır.

İşte pratikte nasıl kullanılabileceğine dair bir örnek:

try {
    // ...
} catch (SomeException e) { 
    e.printStackTrace();
}

2
Ve kontrol edilen istisnalar sayesinde bu muhtemelen catchblokların 1 numaralı içeriğidir :-)
Joey

3
@Joey Orthrow new RuntimeException(e)
Bart van Heukelom

3
ancak iş parçacığı açısından güvenli olmadığı için kötü bir uygulama olarak kabul edilir. Logger ifadesini kullanın ve oraya ekleyin.
Karidrgn

42

Ben de bunu biraz merak ediyordum, bu yüzden ne yaptığını görebileceğiniz küçük bir örnek kod hazırladım:

try {
    throw new NullPointerException();
}
catch (NullPointerException e) {
    System.out.println(e);
}

try {
    throw new IOException();
}
catch (IOException e) {
    e.printStackTrace();
}
System.exit(0);

Aranıyor println(e):

java.lang.NullPointerException

Aranıyor e.printStackTrace():

java.io.IOException
      at package.Test.main(Test.java:74)

Bu normaldir, ilkinde hatanın toString () 'ini çağırırsınız ve 2.de hatadan tüm stackTrace'i yazdırmanızı istersiniz. Bu 2 farklı şey.
Jon

1
System.err.println(e);daha uygun olacaktır.
roottraveller

14

İstisnayı takip etmeye yardımcı olur. Örneğin, programınızda bazı yöntemler yazıyorsunuz ve yöntemlerinden biri hataya neden oluyor. Ardından printstack, hataya hangi yöntemin neden olduğunu belirlemenize yardımcı olacaktır. Stack şu şekilde yardımcı olacaktır:

İlk önce ana yönteminiz çağrılacak ve yığına eklenecek, ardından ikinci yöntem çağrılacak ve LIFO sırasına göre yığına eklenecek ve herhangi bir yöntemin içinde herhangi bir hata oluşursa, bu yığın o yöntemi tanımlamaya yardımcı olacaktır.


11

printStackTrace()programcının asıl sorunun nerede meydana geldiğini anlamasına yardımcı olur. printStacktrace()sınıfının bir yöntemdir Throwablebir java.langpaket. Çıktı konsolunda birkaç satır yazdırır. İlk satır birkaç dizeden oluşur. Throwable alt sınıfının adını ve paket bilgilerini içerir. İkinci satırdan itibaren ile başlayan hata konumunu / satır numarasını açıklar at.

Son satır her zaman hatadan / istisnadan etkilenen hedefi açıklar. İkinci son satır, son satırda belirtilen satır numarasından transfer alındıktan sonra kontrolün gittiği yığındaki bir sonraki satır hakkında bilgi verir. Hatalar / istisnalar fillInStackTrace(), Throwablesınıf yöntemine göre yığına beslenen bir yığın formundaki çıktıyı temsil eder ve bu da program kontrol aktarım ayrıntılarını yürütme yığınına doldurur. İle başlayan satırlar at, yürütme yığınının değerlerinden başka bir şey değildir. Bu şekilde, programcı asıl sorunun kodda nerede olduğunu anlayabilir.

printStackTrace()Yöntemin yanı sıra kullanmak iyi bir fikirdir e.getmessage().


6

printStackTrace()istisnanın meydana geldiği yerleri kaynak kodda yazdırır, böylece programı yazan yazarın neyin yanlış gittiğini görmesine izin verir. Ancak kaynak koddaki sorunları gösterdiğinden, kodlama deneyimi olan veya olmayan kullanıcılar neyin yanlış gittiğini anlayamayabilir, bu nedenle program kullanıcının yazarlara hata mesajları göndermesine izin verirse, Kullanıcılar neyin yanlış gittiğine dair iyi veriler veremeyebilir.

Logger.getLogger()Yöntemi göz önünde bulundurmalısınız, daha iyi bir istisna işleme (günlük kaydı) olanağı sunar ve printStackTrace()bağımsız değişken içermemesinin yanı sıra , eski olduğu kabul edilir ve kullanıcının görüntülemesi için değil YALNIZCA hata ayıklama amacıyla kullanılmalıdır.


2

printStackTrace()Programcı asıl sorun oluştuğu anlamamıza yardımcı olur. printStackTrace()Yöntem sınıfının bir üyesidir Throwableiçinde java.langpaket.


2

printStackTraceThrowablesınıfın bir yöntemidir . Bu yöntem, konsolda hata mesajını görüntüler; kaynak kodda istisnayı alıyoruz. Bu yöntemler catch bloğu ile kullanılabilir ve şunları açıklar:

  1. İstisnanın adı.
  2. İstisnanın açıklaması.
  3. Kaynak koddaki istisnanın yeri.

Konsolda istisnayı tanımlayan üç yöntem (bunlardan printStackTrace bunlardan biridir):

  1. printStackTrace()
  2. toString()
  3. getMessage()

Misal:

public class BabluGope {
    public static void main(String[] args) {
        try {
            System.out.println(10/0);
         } catch (ArithmeticException e) {
             e.printStackTrace();   
             // System.err.println(e.toString());
             //System.err.println(e.getMessage());  
         }
    }
}

1

printStackTrace (), programcının asıl sorunun nerede meydana geldiğini anlamasına yardımcı olur. İstisnayı takip etmeye yardımcı olur. her istisna sınıfı tarafından miras alınan Throwable sınıfının printStackTrace () yöntemidir. Bu yöntem aynı e nesnesi mesajını ve ayrıca istisnanın oluştuğu satır numarasını yazdırır.

Aşağıdaki, Java'daki İstisnanın yazdırma yığınının başka bir örneğidir.

public class Demo {
   public static void main(String[] args) {
      try {
         ExceptionFunc();
      } catch(Throwable e) {
         e.printStackTrace();
      }
   }
   public static void ExceptionFunc() throws Throwable {
      Throwable t = new Throwable("This is new Exception in Java...");

      StackTraceElement[] trace = new StackTraceElement[] {
         new StackTraceElement("ClassName","methodName","fileName",5)
      };
      t.setStackTrace(trace);
      throw t;
   }
}

java.lang.Throwable: Bu, ClassName.methodName'deki Java'daki yeni İstisnadır (fileName: 5)


0

Java'da e.printStackTrace () yönteminin kullanımı nedir?

Bu yöntemi kullanmanın amacı, e.printStackTrace();tam olarak neyin yanlış olduğunu görmektir.

Örneğin, bir istisnayı ele almak istiyoruz. Aşağıdaki Örneğe bir göz atalım.

public class Main{

  public static void main(String[] args) {

    int a = 12;
    int b = 2;

    try {
       int result = a / (b - 2);
       System.out.println(result);
    }

    catch (Exception e)
    {
       System.out.println("Error: " + e.getMessage());
       e.printStackTrace();
    }
  }
}

e.printStackTrace();Neyin yanlış olduğunu tam olarak göstermek için yöntem kullandım .

Çıktıda aşağıdaki sonucu görebiliriz.

Error: / by zero

java.lang.ArithmeticException: / by zero

  at Main.main(Main.java:10)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

-1

Buradaki resme bakın

printStackTrace() hangi satırda hata aldığınızı, herhangi bir neden hata aldığınızı belirtir

Misal:

 java.lang.ArithmeticException: / by zero
    at MinNumber.main(MinNumber.java:8) 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.