我需要从LocalDateTime
插入Scanner
。
我们需要使用输入格式
dd.MM. HH:mm
对于Scanner
(不使用额外的变量!),如何将这些扫描值放入start变量?
Scanner sc = new Scanner(System.in);
System.out.println("Year:");
int year = sc.nextInt();
System.out.println("Start:");
//--- (?) scan something like dd.MM. HH:mm ---
start = LocalDateTime.of(year, month, dayOfMonth, hour, minute)
如果扫描输入的格式不是dd.MM. HH:mm
,程序应该抛出IllegalArgumentException
。我知道这是如何运作的,所以你知道我们不能使用sc.next()
和getsubstring()
:(
答案 0 :(得分:0)
-- Function: retrive_row_count()
-- DROP FUNCTION retrive_row_count();
CREATE OR REPLACE FUNCTION retrive_row_count()
RETURNS integer AS
$BODY$
DECLARE
v_table text;
BEGIN
FOR v_table IN
SELECT table_schema||'.'||table_name
FROM information_schema.columns
WHERE column_name = 'gender'
LOOP
EXECUTE 'INSERT INTO test.row_count(table_name , count) SELECT '''||v_table || ''' , COUNT(*) FROM '||v_table || ' WHERE gender IS NULL' ;
END LOOP;
return 1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION retrive_row_count()
OWNER TO postgres;
允许您指定输入将匹配的模式。如果匹配成功,您可以查询它。这是基本的想法:
Scanner
如果您想要更有趣的东西,可以使用命名组而不是引用数字。您还可以在输入上添加其他约束,这样它就是合法的日期时间格式,但public class Example {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Year:");
int year = sc.nextInt();
System.out.println("Date-time in format: dd.MM. HH:mm");
sc.nextLine();
sc.findInLine("(\\d\\d)\\.(\\d\\d)\\. (\\d\\d):(\\d\\d)");
try {
MatchResult mr = sc.match();
int month = Integer.parseInt(mr.group(2));
int day = Integer.parseInt(mr.group(1));
int hour = Integer.parseInt(mr.group(3));
int minute = Integer.parseInt(mr.group(4));
LocalDateTime dt = LocalDateTime.of(year, month, day, hour, minute);
System.out.println(dt);
} catch (IllegalStateException e) {
System.err.println("Invalid date-time format.");
}
}
}
无论如何都会处理这个问题,这让我感到...
关于异常处理的注意事项:在这种情况下,如果模式未按要求匹配,则抛出LocalDateTime.of
。但是,如果(有效)格式中给出的数字没有意义,则IllegalStateException
将抛出相同的异常,例如LocalDateTime.of
月份。您可能希望单独捕获90
。