A Java Debugging Template
Difference between en2 and en3, changed 0 character(s)
Hello CodeForces,<br>↵
due to the lack of a debugging template in Java (and really just any template in Java), I have decided to write my own template. To use it, add `-DLOCAL` to your custom VM Parameters. Note that you must use↵
`LOCAL = System.getProperty("ONLINE_JUDGE")==null;` for CodeForces; this is not necessary for other OJs. Then call dbg(what you want to print) to print the "what you want to print" part to stderr.↵

To be more exact, when calling dbg(), It will print "Line #%d: [%s]" to stderr, where %d is the line number where you called dbg() and %s is the parameters, separated by commas. For each parameter, if it is able to be iterated using a for each loop (e.g. an array or some class implementing Iterable), it will be printed as {%s} where %s is each element printed, recursively, separated by commas. Otherwise, the .toString() method will be used.↵

Unfortunately, there is no way to get the names of the variables passed into the parameters of a method in Java, so I'd recommend calling dbg("variable_name", variable) to make it easier to read.↵

The code is not very clean (mainly due to the fact that arrays can't be cast to Iterable and because primitives can't be used in parametized methods). Please comment below if you have any suggestions or additions to the template (e.g. a class which this dbg method fails to print properly). I'll try to keep the code updated to the best of my ability.↵

<spoiler summary="Code">↵

~~~~~↵
public static class Debug {↵
//change to System.getProperty("ONLINE_JUDGE")==null; for CodeForces↵
public static final boolean LOCAL = System.getProperty("LOCAL")!=null;↵
private static <T> String ts(T t) {↵
if(t==null) {↵
return "null";↵
}↵
try {↵
return ts((Iterable) t);↵
}catch(ClassCastException e) {↵
if(t instanceof int[]) {↵
String s = Arrays.toString((int[]) t);↵
return "{"+s.substring(1, s.length()-1)+"}";↵
}else if(t instanceof long[]) {↵
String s = Arrays.toString((long[]) t);↵
return "{"+s.substring(1, s.length()-1)+"}";↵
}else if(t instanceof char[]) {↵
String s = Arrays.toString((char[]) t);↵
return "{"+s.substring(1, s.length()-1)+"}";↵
}else if(t instanceof double[]) {↵
String s = Arrays.toString((double[]) t);↵
return "{"+s.substring(1, s.length()-1)+"}";↵
}else if(t instanceof boolean[]) {↵
String s = Arrays.toString((boolean[]) t);↵
return "{"+s.substring(1, s.length()-1)+"}";↵
}↵
try {↵
return ts((Object[]) t);↵
}catch(ClassCastException e1) {↵
return t.toString();↵
}↵
}↵
}↵
private static <T> String ts(T[] arr) {↵
StringBuilder ret = new StringBuilder();↵
ret.append("{");↵
boolean first = true;↵
for(T t: arr) {↵
if(!first) {↵
ret.append(", ");↵
}↵
first = false;↵
ret.append(ts(t));↵
}↵
ret.append("}");↵
return ret.toString();↵
}↵
private static <T> String ts(Iterable<T> iter) {↵
StringBuilder ret = new StringBuilder();↵
ret.append("{");↵
boolean first = true;↵
for(T t: iter) {↵
if(!first) {↵
ret.append(", ");↵
}↵
first = false;↵
ret.append(ts(t));↵
}↵
ret.append("}");↵
return ret.toString();↵
}↵
public static void dbg(Object... o) {↵
if(LOCAL) {↵
System.err.print("Line #"+Thread.currentThread().getStackTrace()[2].getLineNumber()+": [");↵
for(int i = 0; i<o.length; i++) {↵
if(i!=0) {↵
System.err.print(", ");↵
}↵
System.err.print(ts(o[i]));↵
}↵
System.err.println("]");↵
}↵
}↵
}↵
~~~~~↵


</spoiler>↵

**UPD:*** Just realized that CodeForces doesn't allow you to query any property other than "ONLINE_JUDGE". I have accordingly updated the code and added a note.

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en3 English skittles1412 2020-08-09 07:07:42 0 (published)
en2 English skittles1412 2020-08-09 06:40:37 301 (saved to drafts)
en1 English skittles1412 2020-08-02 22:10:06 3415 Initial revision (published)