2013-02-13 35 views
12

Khi tôi chạy đoạn mã sau, tôi sẽ mong đợi một stacktrace, nhưng thay vào đó nó trông giống như nó bỏ qua phần bị lỗi của giá trị của tôi, tại sao điều này xảy ra?Tại sao phân tích cú pháp SimpleDateFormat không mong manh bằng các chữ cái trong?

package test; 

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

public class Test { 
    public static void main(final String[] args) { 
    final String format = "dd-MM-yyyy"; 
    final String value = "07-02-201f"; 
    Date date = null; 
    final SimpleDateFormat df = new SimpleDateFormat(format); 
    try { 
     df.setLenient(false); 
     date = df.parse(value.toString()); 
    } catch (final ParseException e) { 
     e.printStackTrace(); 
    } 
    System.out.println(df.format(date)); 
    } 

} 

Đầu ra là:

07-02-0201

Trả lời

10

Các tài liệu của DateFormat.parse (được thừa hưởng bởi SimpleDateFormat) nói:

The method may not use the entire text of the given string. 
final String value = "07-02-201f"; 

Trong trường hợp của bạn (201f), nó có thể phân tích chuỗi hợp lệ cho đến 201, đó là lý do tại sao nó không cho bạn bất kỳ lỗi nào.

Các "Ném" của cùng một phương pháp đã được xác định như sau:

ParseException - if the beginning of the specified string cannot be parsed 

Vì vậy, nếu bạn cố gắng thay đổi chuỗi của bạn để

final String value = "07-02-f201"; 

bạn sẽ nhận được ngoại lệ phân tích cú pháp , kể từ khi bắt đầu chuỗi được chỉ định không thể được phân tích cú pháp.

1

Xác nhận ... Tôi cũng thấy rằng "07-02-201", "07-02-2012 là ngày" biên dịch. Tuy nhiên, "bar07-02-2011" thì không.

Từ mã trong SimpleDateFormat, có vẻ như việc phân tích cú pháp chấm dứt thời điểm một ký tự bất hợp pháp được tìm thấy làm vỡ kết hợp. Tuy nhiên, nếu Chuỗi đã được phân tích cú pháp cho đến thời điểm đó là hợp lệ thì nó được chấp nhận.

4

Bạn có thể xem liệu toàn bộ chuỗi đã được phân tích cú pháp như sau chưa.

ParsePosition position = new ParsePosition(0); 
    date = df.parse(value, position); 
    if (position.getIndex() != value.length()) { 
     throw new ParseException("Remainder not parsed: " 
       + value.substring(position.getIndex())); 
    } 

Hơn nữa khi một ngoại lệ được ném bởi parse các position cũng sẽ mang lại getErrorIndex().

Các vấn đề liên quan