Yığın izini bir dizeye nasıl dönüştürebilirim?


1502

Sonucunu Throwable.getStackTrace()stacktrace öğesini gösteren bir dizeye dönüştürmenin en kolay yolu nedir ?


6
Çünkü jqno'nun cevabı aslında sorunuzda belirttiğiniz Throwable.getStackTrace () yöntemini kullanır, oysa Brian kullanmaz. Bunun yerine Throwable.printStackTrace () yöntemini kullanır.
Stijn de Witt

10
Hemen hemen her Java projesinde Apache commons-lang bulunmalıdır. Son derece yaygın geliştirme ihtiyaçlarını uygulayan birçok kolaylık yöntemi içerir.
Russell Silva

20
@StijndeWitt Bu üç kod satırının neredeyse kesinlikle onları aradığınız yerden dışa vurma ihtiyacı vardır. Bunları nereye koyacağınızı bilmediğiniz için, diğer kullanışlı snippet'lerle birlikte yardımcı araç kutunuza gideceklerdir. Bingo! guava / commons-lang / neyse ... sadece yeniden icat ettin ... Bunun yerine makul bir yardımcı program kitaplığını içe aktarın ve tekerleği yeniden keşfetmeyi kaydedin. Bir aceminin gerçek işareti, kütüphane yazarlarından daha iyi bir iş yapabileceğinizi düşünüyor.
Andrew Spencer

6
1. Guava'da - Throwables.getStackTraceAsString (e) 2. Apache Commons Lang - ExceptionUtils.getFullStackTrace 3. Kendi özel yöntemlerimizi yazın
user2323036

8
@AndrewSpencer StijndeWitt'i neden küçük bir pasajla başarmak istediği için neden bu kadar çok uğraştığınızı anlamıyorum. Gerçekten çok küçük bir yarar yöntemi yazma tehlikesi yoktur ("SHEER ARROGANCE oh nooooo olarak görmüyorum !! o Apache daha iyi olduğunu düşünüyor !!"). Özellikle Java olmayan JVM dillerinde, sadece bir yığın izlemesi kaydetmek için Guava veya Commons Lang'ı dahil etmek istemeyen tonlarca proje var. Scala & Clojure kütüphanelerini yazıyorum ve kesinlikle Apache Commons Lang'ı sadece bir yöntem için geçişli bir bağımlılık yapmayacak.
jm0

Yanıtlar:


1039

Bir Exceptionyığın izlemesi dönüştürmek için aşağıdaki yöntemi kullanabilirsiniz String. Bu sınıf, birçok popüler açık kaynakla en yaygın bağımlı kütüphane olan Apache commons-lang'da mevcuttur.

org.apache.commons.lang.exception.ExceptionUtils.getStackTrace(Throwable)


88
@Stijn - adil olmak (aşağıda en yüksek oyu alan cevabı yazdım) çok daha fazla işlevsellik için commons-lang'a bakmaya değer
Brian Agnew

54
@StijndeWitt Commons Lang oldukça yaygındır. Halihazırda birçok projemde / projemde zaten mevcut.
WhyNotHugo

16
@Hugo teşekkürler, yeni bir kütüphane eklemekten kaçınmak için StringWriter'ı kullanacaktı - zaten 3 bağımlılığımın bağımlılığı olduğu ortaya çıktı. Geri kalanı için, zaten sahip olup olmadığınızı kontrol edin.
Nathanial

33
@MartinAsenov - mantığınızı takip ederek asla böyle bir kütüphane kullanmazsınız, değil mi? Zaten kullanmadığınız sürece kullanmaz mıydınız?
Brian Agnew

16
Bilginize, paket değişti ve sınıf artık şudur: org.apache.commons.lang3.exception.ExceptionUtils.
schmmd

2201

Throwable.printStackTrace(PrintWriter pw)Yığın izini uygun bir yazara göndermek için kullanın .

import java.io.StringWriter;
import java.io.PrintWriter;

// ...

StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
String sStackTrace = sw.toString(); // stack trace as a string
System.out.println(sStackTrace);

505
Bu kadar küçük ve basit bir şey için harici bir kütüphane eklemeyi sevmiyorsanız, bu yanıtı kullanın.
Stijn de Witt

8
Bu, yığın izlemesini printStackTrace () ile aynı şekilde keser. Yığındaki tüm istisnalar görülebilir, ancak her istisna için yığın kesilebilir. İzin tamamını isteyen herkes bunu dikkate almalıdır.
Laila Agaev

5
Bu, ortaya çıktığı gibi, apache'nin ExceptionUtils.getStackTrace () yönteminin tam olarak yaptığı şeydir. Aslında mektuba neredeyse.
ticktock

6
@BrianAgnew, kapatmak olmamalı StringWriterve PrintWriter?
Muhammad Gelbana

13
@BrianAgnew, cevap için teşekkürler. Beni meraklandırdı ve işte bulduğum şey: stackoverflow.com/questions/14542535/…
Muhammad Gelbana

459

Bu çalışmalı:

StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();

69
Java bağlamında özlü olmak her zaman hilelidir. Bu printStackTracesadece dize döndürmeli, kullanıcıya yazdırıp yazdırmamaya karar vermelidir :)
dmitry

35
Konsolda printStackTrace yazdırma kabul edilebilir, ancak en azından String olarak döndüren getStackTrace varsayılan olarak kullanılabilir olmalıdır
Mateus Viccari

5
Bunun hangi kısmı özlü? Yığın izini bir dizeye koymaktan başka bir amaç için var olmayan 2 nesne oluşturmanız gerekir.
ArtOfWarfare

7
@ dmitry Çağrılan bir yöntem printXXX()XXX yazdırmalıdır.
user207421

2
@Greg Aslında bu alay konusu bile değildi, söylediklerinin açık bir şekilde okunması gerekiyordu.
Andrew

224

Android için geliştiriyorsanız, bunu kullanmanın çok daha kolay bir yolu vardır:

import android.util.Log;

String stackTrace = Log.getStackTraceString(exception); 

Biçim getStacktrace ile aynıdır, örneğin;

09-24 16:09:07.042: I/System.out(4844): java.lang.NullPointerException
09-24 16:09:07.042: I/System.out(4844):   at com.temp.ttscancel.MainActivity.onCreate(MainActivity.java:43)
09-24 16:09:07.042: I/System.out(4844):   at android.app.Activity.performCreate(Activity.java:5248)
09-24 16:09:07.043: I/System.out(4844):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread.access$800(ActivityThread.java:139)
09-24 16:09:07.043: I/System.out(4844):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
09-24 16:09:07.043: I/System.out(4844):   at android.os.Handler.dispatchMessage(Handler.java:102)
09-24 16:09:07.043: I/System.out(4844):   at android.os.Looper.loop(Looper.java:136)
09-24 16:09:07.044: I/System.out(4844):   at android.app.ActivityThread.main(ActivityThread.java:5097)
09-24 16:09:07.044: I/System.out(4844):   at java.lang.reflect.Method.invokeNative(Native Method)
09-24 16:09:07.044: I/System.out(4844):   at java.lang.reflect.Method.invoke(Method.java:515)
09-24 16:09:07.044: I/System.out(4844):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
09-24 16:09:07.044: I/System.out(4844):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)

2
Teşekkürler. Bu durumda, printStackTrace () 'de olduğu gibi her satıra bir tarih ve etiket yazılmaz.
CoolMind

1
Aslında Log.getStackTraceString özünde yukarıda belirtilen (D. Wroblewski) StringWriter ve Printwriter kullanır.
MikeL

2
Android günlüğünde YAZDIRMANIN en kolay yolu: Log.e("TAG", "My message", new Throwable());
Erick M. Sprengel


113

UYARI: Nedeni içermez (genellikle yararlı olanıdır!)

public String stackTraceToString(Throwable e) {
    StringBuilder sb = new StringBuilder();
    for (StackTraceElement element : e.getStackTrace()) {
        sb.append(element.toString());
        sb.append("\n");
    }
    return sb.toString();
}

1
İzi kırpmak istiyorsanız bu yaklaşımın bir uzantısı ile giderdim, örneğin bir maxLines parametresini geçirin ve izlemeye sadece o kadar satır ekleyin
Rich Seller

E.getStackTrace'ten sonraki Parantezler eksik. public static Dize stackTraceToString (Exception e) {StringBuilder sb = new StringBuilder (); for (StackTraceElement öğesi: e.getStackTrace ()) {sb.append (element.toString ()); sb.append ("<br />"); } return sb.toString (); }
rlc

2
Emin değilim, ama bunun kök neden istisnasının yığın izini yazdırmayacağını düşünüyorum.
apoorv020

7
Ne yaparsan yap, izi kesme. Bana birçok kez, GlassFish günlüklerinde, yararlı parçaları kesilmiş bir yığın izine baktım.
cayhorstmann

DOS katmanlarını mutlu etmek için kullanın String.format("%n")veya benzer bir şey kullanın "\n".
ceving

89

Benim için en temiz ve en kolay yol:

import java.util.Arrays;
Arrays.toString(e.getStackTrace());

37
Kod temiz, ancak çıktı değil. Sonunda bir .replaceAll (",", "\ n") yapmanız gerekir. Ancak printStackTrace'in önerdiği girintiyi kaybedersiniz.
öfke

4
Bu, tek bir satıra izleme yaptığınızda kullanışlıdır
webjockey

28
public static String getStackTrace(Throwable t) {
    StringWriter sw = new StringWriter();
    t.printStackTrace(new PrintWriter(sw));
    return sw.toString();
}

1
Merhaba, ben cevap varlığın yorumlar bölümünden noktalarını gösterdi işaret etmek olurdu gibi dışarı o StringWriterve PrintWriternesneler olmalı close.... d (veya ben sadece tahmin PrintWriterbu kapatmalıdır kapanış beri kapalı olması ihtiyacını StringWriterda)
Eric

8
İlhamla mı demek istediniz? Sadece bir yönteme koyuyorsunuz ... Buradaki cevapları okumak "Bugün Aslında
Dündü

26

Aşağıdaki kod log4J Stringgibi API'leri kullanmadan stackTrace öğesinin tamamını bir formatla almanıza olanak tanır java.util.Logger:

catch (Exception e) {
    StackTraceElement[] stack = e.getStackTrace();
    String exception = "";
    for (StackTraceElement s : stack) {
        exception = exception + s.toString() + "\n\t\t";
    }
    System.out.println(exception);
    // then you can send the exception string to a external file.
}

1
evet ama biraz hantal düşünmüyor musun? herhangi bir makul boyutlu proje günlüğü çerçevesinde bir zorunluluk bu yüzden neden rahatsız
mzzzzb

Bu başlangıçta hata mesajı vermiyor. olsa eklenebilir
kommradHomer

Basit birleştirme yerine bir StringBuffer kullanmak isteyebilirsiniz.
dedda1994

Bu, gizlilik nedeniyle mesajı günlüğe kaydetmenize izin verilmediğinde yararlıdır.
A1m

Bu çözümün iç nedenleri
kaydetmeyeceğine dikkat edin

19

İşte doğrudan koda kopyalanabilen bir sürüm:

import java.io.StringWriter; 
import java.io.PrintWriter;

//Two lines of code to get the exception into a StringWriter
StringWriter sw = new StringWriter();
new Throwable().printStackTrace(new PrintWriter(sw));

//And to actually print it
logger.info("Current stack trace is:\n" + sw.toString());

Veya bir yakalama bloğunda

} catch (Throwable t) {
    StringWriter sw = new StringWriter();
    t.printStackTrace(new PrintWriter(sw));
    logger.info("Current stack trace is:\n" + sw.toString());
}

bu , mevcut fonksiyonun kapsamı dışında devam edecektir . nerede Throwabletanımlanır, değil mi?
n611x007

16
Arrays.toString(thrown.getStackTrace())

Sonuç Dize dönüştürmek için en kolay yolu yığın izini yazdırmak için bu benim programında kullanıyorum

LOGGER.log(Level.SEVERE, "Query Builder Issue Stack Trace : {0} ,Message : {1} objid {2}", new Object[]{Arrays.toString(e.getStackTrace()), e.getMessage(),objId});

Benim için çalıştı, hiçbir şey kesilmiş gibi görünmüyor! Herhangi bir harici kütüphane w / o da diğer cevap daha basit, harika cevap!
Shaung Cheng

16

Yığın izini a'ya yazdırın PrintStream, ardından a'ya dönüştürün String:

// ...

catch (Exception e)
{
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    e.printStackTrace(new PrintStream(out));
    String str = new String(out.toByteArray());

    System.out.println(str);
}

1
bu en doğrudan cevaptır
DaSqy Stc

11

Yığının izini dizeye yazdırma

import java.io.PrintWriter;
import java.io.StringWriter;

public class StackTraceUtils {
    public static String stackTraceToString(StackTraceElement[] stackTrace) {
        StringWriter sw = new StringWriter();
        printStackTrace(stackTrace, new PrintWriter(sw));
        return sw.toString();
    }
    public static void printStackTrace(StackTraceElement[] stackTrace, PrintWriter pw) {
        for(StackTraceElement stackTraceEl : stackTrace) {
            pw.println(stackTraceEl);
        }
    }
}

Geçerli iş parçacığı yığın izini, örneği oluşturmadan yazdırmak istediğinizde kullanışlıdır Throwable- ancak yeni oluşturmanın Throwableve yığın izlemesini oradan çağırmanın aslında çağrıdan daha hızlı ve daha ucuz olduğunu unutmayın Thread.getStackTrace.


11

Kotlin

Throwable sınıfını genişletmek size String özelliğini verecektir error.stackTraceString:

val Throwable.stackTraceString: String
  get() {
    val sw = StringWriter()
    val pw = PrintWriter(sw)
    this.printStackTrace(pw)
    return sw.toString()
  }

10
private String getCurrentStackTraceString() {
    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    return Arrays.stream(stackTrace).map(StackTraceElement::toString)
            .collect(Collectors.joining("\n"));
}

1
Teşekkür ederim eddyrkokr! Tüm sınıflarım için mükemmel çalışıyor. Ben sadece temel TestNG sınıfına ekledim ve tüm testlerimden teker teker yığınlar toplar!
Krzysztof Walczewski

9

İlk yorum grubundaki akıllı keskin nişancı çok eğlenceliydi, ama gerçekten ne yapmaya çalıştığınıza bağlı. Zaten doğru kütüphaneye sahip değilseniz, 3 satırlık kod (D. Wroblewski'nin cevabında olduğu gibi) mükemmeldir. OTOH, zaten apache.commons kütüphanesine sahipseniz (çoğu büyük projede olduğu gibi), Amar'ın cevabı daha kısadır. Tamam, kitaplığı almanız ve doğru şekilde yüklemeniz on dakika sürebilir (ne yaptığınızı biliyorsanız birden az). Ancak saat geçiyor, bu yüzden boş zamanınız olmayabilir. Jarek Przygódzki'nin ilginç bir uyarısı vardı - "İç içe istisnalara ihtiyacınız yoksa".

Ama ne olur do tam yığın iç içe izleri ve tüm ihtiyaç? Bu durumda, sır apache.common'un getFullStackTrace'ini kullanmaktır (bkz. Http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ExceptionUtils.html # getFullStackTrace% 28java.lang.Throwable% 29 )

Pastırmamı kurtardı. Teşekkürler Amar, ipucu için!


9

Apache Commons Lang 3.4'ten ( JavaDoc ) kod :

public static String getStackTrace(final Throwable throwable) {
    final StringWriter sw = new StringWriter();
    final PrintWriter pw = new PrintWriter(sw, true);
    throwable.printStackTrace(pw);
    return sw.getBuffer().toString();
}

Diğer cevaplarla farkı , autoFlush üzerinde kullanmasıdırPrintWriter .


8

Onsuz java.io.*böyle yapılabilir.

String trace = e.toString() + "\n";                     

for (StackTraceElement e1 : e.getStackTrace()) {
    trace += "\t at " + e1.toString() + "\n";
}   

Ve sonra tracedeğişken yığın izinizi tutar. Çıktı ayrıca ilk nedeni tutar, çıktı aynıdırprintStackTrace()

Örnek, printStackTrace()verimler:

java.io.FileNotFoundException: / (Is a directory)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
    at Test.main(Test.java:9)

traceBasılı String tutarstdout

java.io.FileNotFoundException: / (Is a directory)
     at java.io.FileOutputStream.open0(Native Method)
     at java.io.FileOutputStream.open(FileOutputStream.java:270)
     at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
     at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
     at Test.main(Test.java:9)

5

Scala versiyonu

def stackTraceToString(e: Exception): String = {
  import java.io.PrintWriter
  val sw = new StringWriter()
  e.printStackTrace(new PrintWriter(sw))
  sw.toString
}

5

Java 8 kullanıyorsanız bunu deneyin

Arrays.stream(e.getStackTrace())
                .map(s->s.toString())
                .collect(Collectors.joining("\n"));

getStackTrace()fonksiyonun kodunu şu şekilde bulabilirsiniz Throwable.java:

public StackTraceElement[] getStackTrace() {
    return getOurStackTrace().clone();
}

ve StackTraceElementbunun için sağlayıcılar toString():

public String toString() {
    return getClassName() + "." + methodName +
        (isNativeMethod() ? "(Native Method)" :
         (fileName != null && lineNumber >= 0 ?
          "(" + fileName + ":" + lineNumber + ")" :
          (fileName != null ?  "("+fileName+")" : "(Unknown Source)")));
}

Yani StackTraceElement"\ n" ile katılın .


Bu çözüm, yığın izleme sekmesi girintisine uymaz, aksi takdirde harika çalışır!
krizajb

4

Gala'nın cevabında istisna nedenlerini de içerecek bir genişleme:

private String extrapolateStackTrace(Exception ex) {
    Throwable e = ex;
    String trace = e.toString() + "\n";
    for (StackTraceElement e1 : e.getStackTrace()) {
        trace += "\t at " + e1.toString() + "\n";
    }
    while (e.getCause() != null) {
        e = e.getCause();
        trace += "Cause by: " + e.toString() + "\n";
        for (StackTraceElement e1 : e.getStackTrace()) {
            trace += "\t at " + e1.toString() + "\n";
        }
    }
    return trace;
}

4

Çözüm dizinin stackTrace değerini dize veri türüne dönüştürmektir. Aşağıdaki örneğe bakın:

import java.util.Arrays;

try{

}catch(Exception ex){
    String stack = Arrays.toString(ex.getStackTrace());
    System.out.println("stack "+ stack);
}

4

Java 8 Stream API ile şöyle bir şey yapabilirsiniz:

Stream
    .of(throwable.getStackTrace())
    .map(StackTraceElement::toString)
    .collect(Collectors.joining("\n"));

Yığın izleme öğeleri dizisini alır, bunları dizeye dönüştürür ve çok satırlı dizeye katılır.


2
Bu çözüm mesajı kaldırıyor ve tüm ana izlemeyi yok
sayıyor

3

Yığın izlemesini ekteki çok satırlı dizeye dönüştürmek için benim oneliner'ım:

Stream.of(e.getStackTrace()).map((a) -> a.toString()).collect(Collectors.joining("\n", "[", "]"))

Kaydediciye "olduğu gibi" geçmek kolaydır.


printStackTrace()Buradan farklı bir şey elde edeceksiniz: 1) Atılan istisna; 2) Nedenleri ve
Yığın İzi

printStackTrace()Asla dönüştürmek sorunun bir parçası olmadığı için , fark oldukça beklenir .
Andrey Lebedenko

2

Harici bir kütüphane kullanmak istemiyorsanız ve Android için geliştirmiyorsanız , aşağıdaki gibi bir 'uzantı' yöntemi oluşturabilirsiniz :

public static String getStackTraceString(Throwable e) {
    return getStackTraceString(e, "");
}

private static String getStackTraceString(Throwable e, String indent) {
    StringBuilder sb = new StringBuilder();
    sb.append(e.toString());
    sb.append("\n");

    StackTraceElement[] stack = e.getStackTrace();
    if (stack != null) {
        for (StackTraceElement stackTraceElement : stack) {
            sb.append(indent);
            sb.append("\tat ");
            sb.append(stackTraceElement.toString());
            sb.append("\n");
        }
    }

    Throwable[] suppressedExceptions = e.getSuppressed();
    // Print suppressed exceptions indented one level deeper.
    if (suppressedExceptions != null) {
        for (Throwable throwable : suppressedExceptions) {
            sb.append(indent);
            sb.append("\tSuppressed: ");
            sb.append(getStackTraceString(throwable, indent + "\t"));
        }
    }

    Throwable cause = e.getCause();
    if (cause != null) {
        sb.append(indent);
        sb.append("Caused by: ");
        sb.append(getStackTraceString(cause, indent));
    }

    return sb.toString();
}

2

Eski soru, ama tüm yığını yazdırmak istemediğiniz özel durumu eklemek istiyorum ilgilendiğiniz bazı parçaları kaldırarak, sınıfları veya paketleri hariç tutarak, .

Kullanım yerine PrintWritera SelectivePrintWriter:

// This filters out this package and up.
String packageNameToFilter = "org.springframework";

StringWriter sw = new StringWriter();
PrintWriter pw = new SelectivePrintWriter(sw, packageNameToFilter);
e.printStackTrace(pw);
String sStackTrace = sw.toString(); 
System.out.println(sStackTrace);

Nerede SelectivePrintWritersınıf verilir:

public class SelectivePrintWriter extends PrintWriter {
    private boolean on = true;
    private static final String AT = "\tat";
    private String internal;

    public SelectivePrintWriter(Writer out, String packageOrClassName) {
        super(out);
        internal = "\tat " + packageOrClassName;
    }

    public void println(Object obj) {
        if (obj instanceof String) {
            String txt = (String) obj;
            if (!txt.startsWith(AT)) on = true;
            else if (txt.startsWith(internal)) on = false;
            if (on) super.println(txt);
        } else {
            super.println(obj);
        }
    }
}

Lütfen bu sınıfın Regex containsveya diğer ölçütlere göre filtrelenecek şekilde kolayca uyarlanabileceğini unutmayın . Ayrıca, Throwableuygulama ayrıntılarına bağlı olduğunu da unutmayın (değişme olasılığı yoktur, ancak yine de).


1
Evet, bu iyi çalışıyor ve aslında oldukça yararlı bir fikir.
gil.fernandes

2
 import java.io.PrintWriter;
import java.io.StringWriter;

public class PrintStackTrace {

    public static void main(String[] args) {

        try {
            int division = 0 / 0;
        } catch (ArithmeticException e) {
            StringWriter sw = new StringWriter();
            e.printStackTrace(new PrintWriter(sw));
            String exceptionAsString = sw.toString();
            System.out.println(exceptionAsString);
        }
    }
}

Programı çalıştırdığınızda, çıktı benzer bir şey olacaktır:

java.lang.ArithmeticException: / by zero
at PrintStackTrace.main(PrintStackTrace.java:9)

1

Merak ediyorum neden kimse söylemedi ExceptionUtils.getStackFrames(exception)

Benim için yığın izini sonuna kadar tüm nedenleriyle boşaltmanın en uygun yolu:

String.join("\n", ExceptionUtils.getStackFrames(exception));

0

Uyarı: Bu biraz konu olabilir, ama oh iyi ...;)

İlk etapta dize olarak yığın izini istemek için orijinal posterlerin nedeninin ne olduğunu bilmiyorum . Yığın izleme bir SLF4J / Logback LOG ile bitmelidir, ancak bir istisna yoktu veya atılmalıdır ne yapıyorum:

public void remove(List<String> ids) {
    if(ids == null || ids.isEmpty()) {
        LOG.warn(
            "An empty list (or null) was passed to {}.remove(List). " +
            "Clearly, this call is unneccessary, the caller should " + 
            "avoid making it. A stacktrace follows.", 
            getClass().getName(),
            new Throwable ("Stacktrace")
        );

        return;
    }

    // actual work, remove stuff
}

Bunu seviyorum çünkü harici bir kütüphane gerektirmiyor (elbette çoğu zaman yerinde olacak olan kayıt arka uçunuz dışında).


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.