java.lang.ClassCastException:java.net.URI不能转换为java.net.URL



我正在编写一个URL验证器。代码如下

public ValidationResult validate(final Object data, final Object root, final String path, final ValidationContext validationContext, final EvaluationContext evaluationContext) {
    ValidationResult validationResult = new ValidationResult();
    @SuppressWarnings("unchecked")
    List<URL> URLs = (List<URL>)data;
    UrlValidator urlValidator = new UrlValidator();
    boolean isValid = true;
    for (URL websiteURL : URLs) {
        if (urlValidator.isValid(websiteURL.getPath())) {
            isValid = true;
        } else {
            isValid = false;
            break;
        }
        System.out.println("websiteURL.getPath() " + websiteURL.getPath());         
    }
    System.out.println("websiteURL.getPath() " + isValid);  
    return validationResult;
}

在调试时,我发现for (URL websiteURL : URLs)给出了java.lang.ClassCastException: java.net.URI cannot be cast to java.net.URL错误。如何使我的逻辑工作?

真正的问题在这里:

@SuppressWarnings("unchecked")
List<URL> URLs = (List<URL>)data;

事实上,调用此代码的对象似乎是URI对象列表,而不是URL对象列表。无论如何,类强制转换是在隐藏强制转换中发生的,当Iterator.next()对象返回的对象被分配给websiteURL时就会发生这种情况。

目前还不清楚正确的解决方案是什么:

  • 您可以(可能)更改调用它的代码,向它传递一个包含URL对象的列表。。。正如验证器所期望的那样。

  • 您可以更改验证器以处理URI对象列表。。。从CCD_ 9变量的声明开始。(见鬼!难道没有人向你解释Java标识符约定吗?)

      @SuppressWarnings("unchecked")
      List<URI> uris = (List<URI>)data;
    
  • 您可以更改验证器以使用URLURI对象。。。首先将上述声明更改为:

      List<?> urls = (List) data;
    

    然后,在验证URIURL对象之前,需要使用instanceof来区分它们。

对于记录,将URI转换为URL的方法是在其上调用URI.toURL()

最新更新