我如何在Java中使方法停止并重新开始

时间:2015-12-26 08:52:45

标签: java methods

标题说明了一切,有没有办法阻止一个方法继续并让它从一开始就重新开始?

#define _GLIBCXX_USE_CXX11_ABI 0
#include "../mynet.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>

using namespace cv;

int main(int argc, char *argv[])
{
    int sockfd = 0,n = 0;
    unsigned char recvBuff[120*160*3];
    struct sockaddr_in serv_addr;
    sockInit();
    memset(recvBuff, '0',sizeof(recvBuff));
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0)
    {
        printf("\n Error : Could not create socket \n");
        return 1;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(5000);
    serv_addr.sin_addr.s_addr = inet_addr(argv[1]);

    if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))<0)
    {
        printf("\n Error : Connect Failed \n");
        return 1;
    }
    printf("Connected to server...\n");
    Mat frame(120, 160, CV_8UC3);
    int csz = 0;
    cvNamedWindow("Display", CV_WINDOW_AUTOSIZE);
    printf("OK here 0\n");
    for(;;)
    {
        csz = 0;
        while((n = recv(sockfd, (char*)recvBuff, sizeof(recvBuff), 0)) > 0)
        {
            printf("OK here 2\n");

            printf("Read %d bytes...\n", n);
            csz += n;
            if(csz<=120*160*3)
            {
                memcpy(frame.data+(csz-n), recvBuff, n);
            }
            if(csz>= 120*160*3) break;
        }
        printf("OK here 3\n");

        printf("Got data of size %d bytes...\n", csz);
        imshow("Display", frame);
        if(csz < 120*160*3)
        {
            printf("\n Read Error \n");
        }
        if(waitKey(30)=='q') break;
        // std::swap(prevgray, gray);
    }
    sockClose(sockfd);

    sockQuit();
    return 0;
}

4 个答案:

答案 0 :(得分:1)

您可以通过返回int grom方法立即从该点返回,例如-1如果不正确并且您知道需要重试,或者如果正确则返回0。在调用代码中,您可以在循环中调用此方法,直到返回代码== 0。

答案 1 :(得分:1)

我会做这样的事情:

读取方法中的数字,无需将它们作为参数传递。在循环中读取它们,直到两个数字都正确输入然后中断。如果输入错误,则打印信息并再次阅读。对于任何错误的输入,Scanner.nextInt()将抛出InputMismatchException异常,在那里我们也将使用该输入中的新行字符。

public static int insertNumbers() {
  int num1;
  int num2;
  while(true) {      // loop until correct input.
    System.out.println("Insert two numbers");
    try {
      num1 = numberScanner.nextInt();
      num2 = numberScanner.nextInt();
      break;        // break once correct input is recorded.
    } catch (InputMismatchException e) {
      System.out.println("Equation format incorrect");  // print message and repeat again for input.
      numberScanner.nextLine();
    }
  }
  answer = num1 + num2;
  return answer;  // return the results.
}

答案 2 :(得分:1)

作为返回退出代码或使用循环的替代方法(我认为这可以更明显,因为您可以使用continue),您可以再次调用该函数并阻止原始实例进一步:

public int foo(){
    //do stuff
    if (must_restart){
        return foo();
        //or, if the function "returns" void: (note that 2 returns/having statements after a return is pointless, this is just an example)
        foo();
        return;
    }
}

答案 3 :(得分:1)

这就是我的建议:

在else的情况下,你只需使用这个结构

else{

    System.out.println("Equation format incorrect");

    return insertNumbers();
}

请注意,在输入为两个数字之前,代码将继续询问输入。不需要方法声明中的参数,因为你不能使用它们