在下面的代码段中,该printStackTrace()
方法在中调用catch block
。运行该程序后,您可以看到有时printStackTrace()
连续运行几次,而不是以printStackTrace()
->
catch block
-> 的顺序运行finally block
。
如果将更static boolean b
改为false
,System.out.print(e)
则按顺序执行。
那么为什么printStackTrace()
行为方式不同呢?(与线程有关?)
public class PrintStackTrace {
static boolean b = true;
public static void main(String[] args){
for(int i = 0; i < 100; i++){
try{
throw new Exception("[" + i + "]");
}
catch(Exception e){
if(b){
e.printStackTrace();
}
else{
System.out.print(e);
}
System.out.print(" Catch: " + i);
}
finally{
System.out.print(" Finally: " + i);
}
System.out.println();
}
}
}
这是因为printStackTrace
写入System.err
时System.out.println
写入System.out
。即使两个System.err
和System.out
用于输出消息的相同底层资源(例如相同的文件或同一控制台),它们冲洗在不同的时刻。
如果要获得 同步 输出,请 同时 输入以下异常System.out
:
e.printStackTrace(System.out);
甚至更好的是,使用记录器,该记录器已经将输出同步到共享资源中,并为您提供了有关消息中正在输出的内容的更多选项,例如类,方法,日期和时间,线程名等,以及诸如编写日志消息之类的其他好处。在数据库中而不是文本文件中,然后打开。
问题内容: 我刚浏览了Android开发者网站,刷新了活动生命周期,在每个代码示例中,超类方法旁边都有一条注释,上面写着“始终先调用超类方法”。 尽管这在创建半周期(onCreate,onStart和onResume)中是有意义的,但对于销毁半周期的正确过程是什么,我还是有些困惑:onPause,onStop,onDestroy。 首先销毁实例专用资源,然后销毁实例专用资源可能依赖的超类资源,这是
问题内容: 我觉得这里缺少明显的东西! 输出: 当然应该输出: 这是怎么了 问题答案: 字典未排序。如果需要依赖顺序,则需要一个OrderedDict- Python 2.7的模块中有一个,或者您可以使用多种食谱之一。
我对使用try/catch/finally子句有疑问,让我解释一下:我知道每个在其声明中声明异常规范的方法都必须(在调用方法中)被一个try块包围,然后是一个可以捕获该异常的catch块(除非我没有声明调用方法也抛出异常)。如果调用方法在try-catch之后有其他语句,则无论发生什么情况(是否引发异常),都会执行这些语句。如果我有以下代码: 这里有一个名为(猜猜看:)Throwing()的方法,
因此,这是我第一次使用JBehave,我试图在项目中创建第一个JBehave,但目前似乎测试没有执行这些步骤。最后,测试表明所有测试用例都通过了,没有任何问题,但实际上它们根本没有被执行。我在每个步骤方法中都设置了断点,而且我的调试器根本不会阻止我,更不用说这些步骤当前抛出的异常了。 和测试执行器: 你知道有什么问题吗?
问题内容: 我想使用Java中的toString()方法将字符数组转换为字符串对象。这是我使用的测试代码的片段: 原则上,它应该打印abcdef,但是每次程序执行时它都打印[C @ 6e1408或[C @ e53108]之类的乱码。我不需要替代方案,但想知道为什么会这样。 问题答案: 为了使人可读,你必须使用,例如: Java的数组是,其后是代表数组元素类型的字符(在你的情况下为),然后@是数组的
问题内容: 我很好奇printStackTrace()和toString()之间的区别是什么。乍一看,他们 似乎 做的完全相同。 码: 问题答案: 不,有重要区别!使用toString,您只有异常的类型和错误消息。使用printStackTrace()可以获得异常的整个堆栈跟踪,这对于调试非常有帮助。 System.out.println(toString())的示例: printStackTra