我已经处理了3个代码,显示了一些奇怪的行为。我定义了一个void exit()方法,它是在没有用户实际告诉代码退出的情况下随机执行的。以下是一种方法:
void exit()
{
println("clearing buffer and closing file");
if (output != null) {
print("output is not null");
try {
output.close();
}
catch (IOException e) {
println("Error while closing the writer");
}
}
super.exit();
}如您所见,它所做的唯一一件事就是试图关闭一个名为output的缓冲编写器。冲洗这个作家不是关键,所以现在我只是把它从我的草图中删除。但从长远来看,我很好奇这是如何发生的。在我的代码中,没有其他地方是显式调用exit方法的。呃,代码不能决定退出。只有当用户使用X关闭问题时,才会使用X。
注意:我不能上传整个代码,这个方法也是附加的,因为它太长了。我想更好的表达我的问题的方法可能是:
“嗨,我是一个不知道退出方法的菜鸟。不管怎么说,这个方法可以在我不显式调用它或按退出按钮的情况下被调用吗?”
发布于 2016-06-06 14:25:29
将其添加到exit()方法的开头。
new Exception().printStackTrace();由此产生的堆栈跟踪应该允许您找出调用exit()方法的方法。
如果不能调整代码,则可以使用调试器运行应用程序,并在exit()方法开始时设置断点。
要回答你关于这是否可能的问题,答案取决于你所说的“没有我明确的呼唤”。调用方法有多种方法,其中有些方法非常模糊。
exit方法的exit对象,然后在其上调用invoke(...)。exit()调用的Java源代码,编译它,加载它,并运行它。exit()调用插入到“无害”方法中。还有..。
exit()。发布于 2016-06-06 13:47:04
简而言之,你的问题的答案是肯定的。
可以使用同一类加载器中的任何类或层次结构中的任何其他类动态地找到和调用您的方法。
此外,它还具有默认访问权限。因此,它可以由同一个包中的任何类静态地调用。
发布于 2016-06-06 14:23:51
+1对于@Andres,反射是一种可能性。
您试过在方法上使用断点并查看线程的堆栈跟踪吗?
就我个人而言,我不使用断点(只是我的风格),我会尝试以编程的方式查看线程。也许下面的一些代码可以帮助您查看线程并了解所发生的事情:
public class ThreadUtil {
/** Blocked constructor **/
private ThreadUtil() {
}
/**
* Get the stackstrace of the current {@link Thread}.
* The stacktrace will be returned in the form of a string.
*/
public static String getStackTrace() {
return getStackTrace(Thread.currentThread());
}
/**
* Get the stackstrace of a {@link Thread}.
* The stacktrace will be returned in the form of a string.
*/
public static String getStackTrace(Thread thread) {
StringBuilder sb = new StringBuilder();
StackTraceElement[] currThreadStackTraceElementList = thread.getStackTrace();
appendStackTrace(sb, currThreadStackTraceElementList);
return sb.toString();
}
public static String getAllStackTraces() {
StringBuilder sb = new StringBuilder();
Map<Thread, StackTraceElement[]> threadList = Thread.getAllStackTraces();
for (StackTraceElement[] currThreadStackTraceElementList : threadList.values()) {
appendStackTrace(sb, currThreadStackTraceElementList);
}
return sb.toString();
}
private static void appendStackTrace(StringBuilder sb,
StackTraceElement[] currThreadStackTraceElementList) {
sb.append("Thread stack trace: \n");
for (StackTraceElement currThreadStackTraceElement : currThreadStackTraceElementList) {
sb.append("\t" + currThreadStackTraceElement + "\n");
}
sb.append("\n");
}
}https://stackoverflow.com/questions/37658731
复制相似问题