简体   繁体   English

Java-如果条件失败,请返回程序流的开头

[英]Java - Go back to beginning of program flow if condition failed

Just as I write this I can imagine how basic the question is but here I go .. 就像我写这篇文章一样,我可以想像这个问题有多么基本,但是我在这里..

I have a Java client wherein I validate a 'date' input entered by user and if valid pass it along elsewhere. 我有一个Java客户端,其中我验证用户输入的“日期”输入,如果有效,则将其传递给其他地方。 I am using JOptionPane to show input dialog box. 我正在使用JOptionPane显示输入对话框。

Basically when an invalid date format is entered by the user my program quits and the user has to restart the program again. 基本上,当用户输入了无效的日期格式时,我的程序退出了,用户必须再次重新启动程序。 Instead of that I wanted the pop-up inputdialog box to be shown after 'Invalid Date Entered" message is displayed. What would be the best way to pass control to that line of code again ? 取而代之的是,我希望在显示“输入无效日期”消息之后显示弹出的输入对话框,这是将控制权再次传递给该行代码的最佳方法是什么?

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Properties;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import javax.swing.JOptionPane;

public class Client {

  static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

  public static void main(String[] args) throws IOException, ParseException {

    Properties prop = new Properties();
    InputStream IP = null;
    //  SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

    try {

      IP = new FileInputStream("Client.properties");
      prop.load(IP);
      String host = prop.getProperty("ServerIP");
      String port = prop.getProperty("Port");
      int port1 = Integer.parseInt(port);

      Socket s = new Socket(host, port1);
      String reportDate = JOptionPane.showInputDialog("Enter Date:");
      PrintWriter out = new PrintWriter(s.getOutputStream(), true);

      /**
       * User Input Validation
       */
      if (reportDate.matches("^((19|20)\\d\\d)-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])$")) {

        out.println(reportDate);
        s.close();

        System.exit(0);
      } //if
      else {
        String Error = "INCORRECT date format entered!";
        JOptionPane.showMessageDialog(null, Error);
      } //else
    } catch (IOException ex) {
      ex.printStackTrace();
    } finally {
      if (IP != null) {
        try {
          IP.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
  }
}

在成功情况下使用System.exit(0)时,只需将代码包装在while (true) { }的无限循环中即可。

Do something like this (pseudocode): 做这样的事情(伪代码):

String reportDate = "badDate";
while (!reportDate.matches("^((19|20)\\d\\d)-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])$"))
{
//do all the things that are currently in your if statement
}

I know this is not directly related to the response you are looking for. 我知道这与您要查找的响应没有直接关系。 In fact the direct answer to your question is use a loop and it will work the way you are expecting. 实际上,对您问题的直接答案是使用循环,它将按您期望的方式工作。

However, if you want to do this for selecting date you should consider using Java SwingX . 但是,如果要选择日期,则应考虑使用Java SwingX

SwingX library has a lot of good components including excellent date picker SwingX库具有很多好的组件,包括出色的日期选择器

在此处输入图片说明

I think this may help you to take a valid Date : 我认为这可以帮助您取得有效的Date

Date reportDate;
do { 
    try {
        String str = JOptionPane.showInputDialog("Enter Date:");
        reportDate = new SimpleDateFormat("yyyy-MM-dd").parse(str);
        break;// loop break when got a valid date e.g. 2016-09-16
    } catch (Exception mistake) {
        System.err.println("Invalid input: " + mistake);
    }
} while (true);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM