0

我是一名 Java 新手,正在阅读一些培训材料,这是问题之一。

给定一个有效的 DateFormat 对象 df,并且

Date d = new Date(0L);
String ds = "December 12, 2012";
//Insert correct code here

什么用 ds 表示的日期更新 d 的值?

A. d = df.parse(ds);
B. d = df.getDate(ds);
C. try{
        d = df.parse(ds);
       }
   catch(ParseException e){ };

正确答案是 C。为什么会这样?A和C有什么区别?

4

4 回答 4

2

因为parse()可以抛出ParseException并且它是一个已检查的异常。Checked Exceptions 必须由调用代码使用try-catch块来处理,或者您的代码必须使用 throws 子句声明它可以抛出 Exception 。

已检查异常是 Java 设计者认为您的程序绝对必须以一种或另一种方式提供的异常。每当您编写可能引发检查异常的语句时,您的程序必须执行以下两项操作之一:

  1. 通过将语句放在具有异常捕获块的 try 语句中来捕获异常。

  2. 在包含该语句的方法上指定 throws 子句,以指示您的方法不想处理异常,因此它将异常向上传递。

更好的代码应该是:

try{
    d = df.parse(ds);
   }
catch(ParseException e){   
   e.printStackTrace();
   // log the exception
   throw new RuntimeException(e);
}

阅读本文以获取有关 Checked Exceptions 的更多信息

于 2013-07-10T20:35:27.533 回答
1

parse方法抛出一个检查异常,ParseException(它不是 a RuntimeException),所以它必须被捕获,否则它是一个编译器错误。

于 2013-07-10T20:35:39.290 回答
1

如果有问题的代码发现自己:

  1. 在一个没有声明 check 的方法中ParseException并且
  2. 在任何会捕获它的 try-catch 块之外,

那么A 会给出一个编译器错误:Uncaught exception ParseException: must be caught or declared to be thrown.

但是,如果您从字面上替换//Insert correct code here为 C 下的代码,并尝试实际读取它后面的变量d,您将得到错误local variable may not have been initialized

更不用说空的 catch 块,以及它后面的有趣的分号......

总之,这是您必须使用的非常糟糕的材料。

于 2013-07-10T20:35:46.427 回答
-1

import java.util.Scanner;
import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Main 
{
    public static final String FORMAT ="dd/MM/yyyy";
    
    public static void main(String[] args)         
    {
            Scanner sc=new Scanner(System.in);
            String date_input = sc.nextLine();
            Date d1;
            try
            {
                d1 = convertStringToDate(date_input);
                System.out.println(date_input+" is a valid date");
            }
            catch(ParseException e)
            {
                System.out.println(date_input+" is not a valid date");
            }
    }
    
    public static Date convertStringToDate(String str) throws ParseException
    {
        
            SimpleDateFormat df = new SimpleDateFormat(FORMAT);
            df.setLenient(false);
            Date d = df.parse(str);
            return d;
    }

}

于 2021-05-18T10:06:54.890 回答