Processing 未使用exit命令输入exit()方法

Processing 未使用exit命令输入exit()方法,processing,exit,Processing,Exit,我有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) {

我有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关闭问题时

注意:我不能上传整个代码,因为这个方法太长,所以附加了太多。我想表达我的问题最好的方式是:


“嗨,我是一个对退出方法一无所知的noob。不管怎样,这个方法可以在没有我显式调用它或点击退出按钮的情况下被调用吗?”

简而言之,你的问题的答案是肯定的

您的方法可以由同一类加载器中的任何类或层次结构中的任何其他类使用反射动态地找到和调用


此外,它还有一个默认访问权限。因此它可以被同一个包中的任何类静态调用。

+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");
    }
}
公共类ThreadUtil{
/**阻塞构造函数**/
私有ThreadUtil(){
}
/**
*获取当前{@link Thread}的stackstrace。
*stacktrace将以字符串的形式返回。
*/
公共静态字符串getStackTrace(){
返回getStackTrace(Thread.currentThread());
}
/**
*获取{@link-Thread}的stackstrace。
*stacktrace将以字符串的形式返回。
*/
公共静态字符串getStackTrace(线程){
StringBuilder sb=新的StringBuilder();
StackTraceElement[]currThreadStackTraceElementList=thread.getStackTrace();
appendStackTrace(sb,currThreadStackTraceElementList);
使某人返回字符串();
}
公共静态字符串getAllStackTraces(){
StringBuilder sb=新的StringBuilder();
Map threadList=Thread.getAllStackTraces();
对于(StackTraceElement[]currThreadStackTraceElementList:threadList.values()){
appendStackTrace(sb,currThreadStackTraceElementList);
}
使某人返回字符串();
}
私有静态跟踪(StringBuilder sb,
StackTraceElement[]currThreadStackTraceElementList){
sb.append(“线程堆栈跟踪:\n”);
用于(StackTraceElement currThreadStackTraceElement:currThreadStackTraceElementList){
sb.追加(“\t”+currThreadStackTraceElement+”\n”);
}
某人附加(“\n”);
}
}

exit()
方法的开头添加此选项

    new Exception().printStackTrace();
生成的stacktrace应该允许您找出调用您的
exit()
方法的原因

    new Exception().printStackTrace();
或者,如果无法调整代码,可以使用调试器运行应用程序,并在
exit()
方法的开头设置断点

    new Exception().printStackTrace();

要回答你关于是否可能的问题,答案取决于你所说的“没有我明确地打电话”是什么意思。调用一个方法有很多种方法,其中有些方法非常模糊;e、 g

  • 您可以使用反射从声明类中获取
    exit
    方法的
    方法
    对象,然后对其调用
    invoke(…)
  • 您可以通过JNI或JNAAPI从本机代码调用Java方法
  • 您可以生成包含
    exit()
    调用的Java源代码,对其进行编译、加载和运行
  • 您可以使用BCEL或类似方法将
    exit()
    调用插入到“无辜”方法中
而且

  • 如果JVM上附加了调试代理,则调试器可以在JVM中的某个线程上调用
    exit()

这是一种特定于处理的东西

void exit()

正如报告中所述:

exit()不会立即终止,而是会导致草图终止 在draw()完成后退出(如果调用,则在setup()完成后退出) 在setup()函数中)

对于Java程序员来说,这与System.exit()不同。进一步的 不应使用System.exit(),因为正在关闭应用程序 draw()运行时可能会导致崩溃(尤其是P3D)

exit()

void draw() {
  line(mouseX, mouseY, 50, 50);
}

void mousePressed() {
  exit(); 
}
它在一些地方被调用,特别是在按下
ESC
⌘按w


只需将您的方法重命名为exit()以外的其他方法。

正在执行的代码是什么?是否覆盖父exit()方法?能否提供一个显示问题的方法?您不必上载整个代码。正如Kevin在上面所说的:提供一个最小的、完整的、可验证的例子来展示问题。这并不意味着要提供完整的代码。@Murenrb这正是我们要求提供完整代码的原因。你发布的代码信息远远不够。什么都可以叫它。试着在控制台上打印一个堆栈跟踪来跟踪它的名字。我真的很感激你的回答!你能详细说明一下吗?“任何类使用反射”或“默认访问”是什么意思。正确的实施方法是什么,这样就不会发生这种情况