天道酬勤,学无止境

SonarQube java.lang.ClassCastException:无法将 ParametrizedTypeJavaType 强制转换为 ParametrizedTypeJavaType(SonarQube java.lang.ClassCastException: ParametrizedTypeJavaType cannot be cast to ParametrizedTypeJavaType)

问题

我正在尝试制定自己的 SonarQube 规则,该规则的目的是检查我是否没有在特定对象的集合上使用 contains 方法。 整数对象示例:

    List<Integer> a = new ArrayList<>();
    a.contains(1); // Noncompliant

为此,我正在尝试获取 ParametrizedTypeJavaType。 然后我将能够测试它是否是整数......

    @Override
public void visitNode(Tree tree) {
    MethodInvocationTree methodInvocationTree = (MethodInvocationTree) tree;
    ExpressionTree expressionTree = ((MethodInvocationTree) tree).methodSelect();
    if(expressionTree.is(Kind.MEMBER_SELECT)){
        MemberSelectExpressionTree memberSelectExpressionTree = (MemberSelectExpressionTree) expressionTree;
        Type type = memberSelectExpressionTree.expression().symbolType();
        ParametrizedTypeJavaType parametrizedTypeJavaType = (ParametrizedTypeJavaType) type;
        // SOME CODE Test if it is an integer or not ...
        reportIssue(tree,"REPORT !");

    }


}

@Override
public List<Kind> nodesToVisit() {
    List<Kind> kinds = new ArrayList<>();
    kinds.add(Kind.METHOD_INVOCATION);
    return kinds;
}

}

在 jUnit 测试期间它似乎运行良好,但是当我在我的测试项目上启动 sonnar-scanner 时,我收到以下错误:

Caused by: java.lang.ClassCastException: org.sonar.java.resolve.ParametrizedTypeJavaType cannot be cast to org.sonar.java.resolve.ParametrizedTypeJavaType
    at org.sonar.samples.java.checks.CollectionCheck.visitNode(CollectionCheck.java:38)

我做了一些研究,遇到了这个问题,这看起来是我的问题:

Sonarqube 错误 java.lang.ClassCastException:org.sonar.java.resolve.SemanticModel 无法转换为 org.sonar.java.resolve.SemanticModel

我也遇到了这条规则,它看起来与我的规则非常相似,并且使用了 ParametrizedTypeJavaType。

https://github.com/SonarSource/sonar-java/blob/master/java-checks/src/main/java/org/sonar/java/checks/CollectionInappropriateCallsCheck.java

所以我完全糊涂了。 处理我的问题的好方法是什么?

SonarQube 版本:6.3.1

谢谢你的帮助。

回答1

ParametrizedTypeJavaType不是自定义规则的 java api 的一部分。 并且截至今天,语义 API 不允许您访问泛型信息:这是计划但未计划的:https://jira.sonarsource.com/browse/SONARJAVA-1871

您最好依靠现有规则来实现您想要实现的目标:https://sonarqube.com/coding_rules#rule_key=squid%3AS2175

如果此规则对您不起作用,您能解释一下原因吗?

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • SonarQube java.lang.ClassCastException: ParametrizedTypeJavaType cannot be cast to ParametrizedTypeJavaType
    I am trying to make my own SonarQube rule, the objective of the rule is to check that I am not using the contains method on a collection of a specific object. Example with Integer Object : List<Integer> a = new ArrayList<>(); a.contains(1); // Noncompliant To do that I am trying to get the ParametrizedTypeJavaType. Then I will be able to test if it is an Integer or not ... @Override public void visitNode(Tree tree) { MethodInvocationTree methodInvocationTree = (MethodInvocationTree) tree; ExpressionTree expressionTree = ((MethodInvocationTree) tree).methodSelect(); if(expressionTree.is(Kind
  • Sonarqube 错误 java.lang.ClassCastException:org.sonar.java.resolve.SemanticModel 无法转换为 org.sonar.java.resolve.SemanticModel(Sonarqube error java.lang.ClassCastException: org.sonar.java.resolve.SemanticModel cannot be cast to org.sonar.java.resolve.SemanticM
    问题 嗨,我根据 java-web-plugin 3.5 的一些检查(java-checks 3.5 的 pom 中的依赖性)为声纳 5.1.2 编写了自己的插件,当我尝试对项目运行分析时出现错误: Caused by: java.lang.ClassCastException: org.sonar.java.resolve.SemanticModel cannot be cast to org.sonar.java.resolve.SemanticModel at org.sonar.java.checks.SubscriptionBaseVisitor.scanFile(SubscriptionBaseVisitor.java:32) at org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:123) at org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:94) ... 38 more 例如,我从 BadMethodName_S00100_Check.java 复制到我的插件代码,只更改了类名、描述和问题信息。 为什么我会出错? 其他不使用语义模型的检查工作得很好。 回答1 这是因为 SemanticModel
  • Sonarqube error java.lang.ClassCastException: org.sonar.java.resolve.SemanticModel cannot be cast to org.sonar.java.resolve.SemanticModel
    Hi I wrote own plugin for sonar 5.1.2 based on some checks from java-web-plugin 3.5 (dependency in pom for java-checks 3.5) and when I try to run analysis on project i get error: Caused by: java.lang.ClassCastException: org.sonar.java.resolve.SemanticModel cannot be cast to org.sonar.java.resolve.SemanticModel at org.sonar.java.checks.SubscriptionBaseVisitor.scanFile(SubscriptionBaseVisitor.java:32) at org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:123) at org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:94) ... 38 more for example i copied to my plugin code
  • ClassCastException: org.sonar.java.model.expression.MethodInvocationTreeImpl cannot be cast to org.sonar.plugins.java.api.tree.IdentifierTree(ClassCastException: org.sonar.java.model.expression.MethodInvocationTreeImpl cannot be cast to org.sonar.plugins.
    问题 今天我们将 SonarQube Java 插件从 3.2 升级到 3.3 (http://docs.sonarqube.org/display/PLUG/Java+Plugin)。 现在分析以失败告终: 13:59:10 [ERROR] Failed to execute goal org.codehaus.mojo:sonar-maven-plugin:2.6:sonar (default-cli) on project ingbol: SonarQube is unable to analyze file : '/var/lib/jenkins/workspace/ing_trunk_sonar/sources/cib-actions/src/main/java/com/company/cib/corpo/struts/actions/IngCcsRightsAction.java': org.sonar.java.model.expression.MethodInvocationTreeImpl cannot be cast to org.sonar.plugins.java.api.tree.IdentifierTree -> [Help 1] 13:59:10 org.apache.maven.lifecycle
  • ClassCastException: org.sonar.java.model.expression.MethodInvocationTreeImpl cannot be cast to org.sonar.plugins.java.api.tree.IdentifierTree
    Today we upgraded SonarQube Java plugin from 3.2 to 3.3 (http://docs.sonarqube.org/display/PLUG/Java+Plugin). Now the analysis end with failure: 13:59:10 [ERROR] Failed to execute goal org.codehaus.mojo:sonar-maven-plugin:2.6:sonar (default-cli) on project ingbol: SonarQube is unable to analyze file : '/var/lib/jenkins/workspace/ing_trunk_sonar/sources/cib-actions/src/main/java/com/company/cib/corpo/struts/actions/IngCcsRightsAction.java': org.sonar.java.model.expression.MethodInvocationTreeImpl cannot be cast to org.sonar.plugins.java.api.tree.IdentifierTree -> [Help 1] 13:59:10 org.apache
  • java_不指定泛型的类型参数的弊端以及使用泛型的好处(以集合为例)
    package experiment4.study; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class GenericDemo { public static void main(String[] args) { Collection coll = new ArrayList(); coll.add("abc"); coll.add("zjgsu"); coll.add(5);//由于集合没有做任何限定,任何类型都可以给其中存放 Iterator it = coll.iterator(); while (it.hasNext()) { //需要打印每个字符串的长度,就要把迭代出来的对象转成String类型 String str = (String) it.next();/*在处理第三个元素(是整形数5),不能够转换为String;会引发java.lang.ClassCastException*/ System.out.println(str+":"+str.length()); } } } /*Exception(意外/例外;expectation) in thread "main" java.lang.ClassCastException
  • java.lang.ClassCastException:oracle.sql.TIMESTAMP无法转换为java.sql.Timestamp(java.lang.ClassCastException: oracle.sql.TIMESTAMP cannot be cast to java.sql.Timestamp)
    问题 我正在通过网络流ResultSet的应用程序上工作。 我最终使用了CachedRowSetImpl类。 但是,当我连接到Oracle数据库时,会出现这样的错误 java.lang.ClassCastException:oracle.sql.TIMESTAMP无法转换为java.sql.Timestamp 请帮忙。 源代码如下: ResultSet res = response.getResultSet(); //resultset from the server while (res.next()) { Agent agent = new Agent(); agent.setName(res.getString(2)); agent.setMobile(res.getString(1)); agent.setBalance(res.getLong(4)); agent.setLastUpdate(res.getDate(3)); //date from the result set agent.setAccountNumber(res.getString(5)); } 错误 ... java.lang.ClassCastException:oracle.sql.TIMESTAMP不能强制转换为java.sql.Timestamp java.lang
  • 为什么显示java.lang.ClassCastException:android.text.SpannableString无法转换为java.lang.String?(Why show java.lang.ClassCastException: android.text.SpannableString cannot be cast to java.lang.String?)
    问题 从任何浏览器页面复制String , pasteData正常工作。 但是,从已发送邮件的项目编辑器(字段)复制SpannedString时,应用程序崩溃并显示以下错误消息: java.lang.ClassCastException: android.text.SpannableString cannot be cast to java.lang.String 我的代码: // since the clipboard contains plain text. ClipData.Item item = clipBoard.getPrimaryClip().getItemAt(0); // Gets the clipboard as text. String pasteData = new String(); pasteData = (String) item.getText(); 下面的ClipboardManager实例定义为clipBoard : clipBoard = (ClipboardManager) context.getSystemService(context.CLIPBOARD_SERVICE); clipBoard.addPrimaryClipChangedListener(new ClipboardListener())
  • java.lang.ClassCastException:[Ljava.lang.Object; 无法转换为[Ljava.lang.String;(java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;)
    问题 我需要将HashMap转换为String数组,以下是我的Java代码 import java.util.HashMap; import java.util.Map; public class demo { public static void main(String[] args) { Map<String, String> map1 = new HashMap<String, String>(); map1.put("1", "1"); map1.put("2", "2"); map1.put("3", "3"); String[] str = (String[]) map1.keySet().toArray(); for(int i=0; i<str.length;i++) { System.out.println(str[i]); } } } 当我运行代码时,我得到以下ClassCastException 。 Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String; at demo.main(demo.java:17) 回答1 toArray()返回Object[] ,而不管泛型如何。
  • java.lang.ClassCastException:无法将java.util.Arrays $ ArrayList强制转换为java.util.ArrayList(java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList)
    问题 您能解释一下为什么会发生这种情况吗,请问如何解决? 因此,我使用的是Oracle-ADF,而我使用的是穿梭组件。 我使用sos1.getValue();获得选定的值sos1.getValue(); getValue()方法返回一个对象,我正尝试将其转换为ArrayList,以便以后可以使用它。 因此,我创建了ArrayList sos1Value 但是,下面这行代码简直就是香蕉: sos1Value = (ArrayList) Arrays.asList(sos1.getValue()); 而且我一直在获取java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList 我尝试了其他方式,例如: sos1Value = (ArrayList) sos1.getValue(); 但是我仍然遇到同样的问题,该怎么办? 回答1 Arrays.asList返回一个List实现,但不是java.util.ArrayList 。 它碰巧具有ArrayList的类名,但这是Arrays的嵌套类-与java.util.ArrayList完全不同的类型。 如果需要java.util.ArrayList ,则可以创建一个副本: ArrayList<Foo> list =
  • java.lang.ClassCastException:无法将oracle.sql.BLOB强制转换为oracle.sql.BLOB(java.lang.ClassCastException: oracle.sql.BLOB cannot be cast to oracle.sql.BLOB)
    问题 我在使用jdbc从oracle DB到Java API检索blob对象时遇到问题。 问题是,当我使用数据库中的函数执行Collable语句时,该函数返回一个blob字段,此异常在行上抛出: tempBlob = (oracle.sql.BLOB)cstmt.getObject(1); 出现此错误消息: java.lang.ClassCastException: oracle.sql.BLOB cannot be cast to oracle.sql.BLOB. 我从数据库获得的对象是oracle.sql.BLOB的实例。 tempBlob变量是一个对象oracle.sql.BLOB 。 问题出在哪儿? 回答1 您的类路径中可能有两个oracle jar文件。 请取出一个罐子,然后再次部署。 回答2 有时一个JAR在应用程序类路径中,另一个在应用程序服务器类路径中(例如:在Tomcat $CATALINA_HOME/lib ) 回答3 不要像这样再次投射: BLOB tempBlob = (oracle.sql.BLOB)cstmt.getObject(1); 解决方案 : OutputStream outstrm =(rs.getBlob(1)).setBinaryStream(1L); 回答4 生成碧玉报告时出现此错误。 我在该报告的jrxml文件中将class
  • Java:无法将 Gridlayout 应用于 Jscrollpane。 获取获取 java.lang.ClassCastException(Java: Can't apply Gridlayout to a Jscrollpane. Get Get java.lang.ClassCastException)
    问题 我使用 Gridlayout 在一行中放置 4 个元素。 首先,我有一个 JPanel,一切正常。 对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。 现在我的JPanel上添加了一个JScrollPane 。 我使用了相同的代码,现在我只是将元素添加到Jscrollpane的视口,但现在我得到这个异常Get java.lang.ClassCastException: layout of JScrollPane must be a ScrollPaneLayout: at javax.swing.JScrollPane.setLayout(Unknown Source) ,我不知道为什么。 为什么 Gridlayout 对于Jscrollpane不应该是未知的? 这是代码: public objectDetails() { setTitle("LLI_MC_Solver"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); contentPane = new JPanel(); contentPane.setLayout(new GridLayout()); setBounds(100, 100, 510, 401); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5
  • java.lang.ClassCastException:android.view.AbsSavedState $ 1无法转换为android.support.v7.widget.Toolbar $ SavedState(java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.support.v7.widget.Toolbar$SavedState)
    问题 我的应用程序从后台运行到前台时,经常崩溃。 Scenerio:假设我正在玩任何游戏,并且我的应用程序在最近的列表中,并且播放后,如果我选择了应用程序,它将崩溃并显示错误。 我的应用程序中没有工具栏,只有我使用过的动作栏。 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.fcords.android/com.fcords.android.Home.HomeScreen.HomePage_New}: java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.support.v7.widget.Toolbar$SavedState at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388) at android.app.ActivityThread.access$800(ActivityThread.java:148) at
  • 列表上的UISelectMany 导致java.lang.ClassCastException:java.lang.String无法转换为T(UISelectMany on a List<T> causes java.lang.ClassCastException: java.lang.String cannot be cast to T)
    问题 我在List<Long>上使用<p:selectCheckboxMenu List<Long> : <p:selectCheckboxMenu value="#{bean.selectedItems}"> <f:selectItems value="#{bean.availableItems}" /> </p:selectCheckboxMenu> private List<Long> selectedItems; private Map<String, Long> availableItems; 提交表单并按以下方式遍历所选项目时, for (int i = 0; i < selectedItems.size(); i++) { Long id = selectedItems.get(i); // ... } 然后我得到一个类强制转换异常: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long at com.example.Bean.submit(Bean.java:42) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect
  • java.lang.ClassCastException:无法将类java.lang.Integer强制转换为类java.lang.Long
    在下面的示例中, jdbcTemplate.queryForList返回一个Integer对象,我们尝试将其直接转换为Long : public List<Customer> findAll() { String sql = "SELECT * FROM CUSTOMER"; List<Customer> customers = new ArrayList<>(); List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql); for (Map row : rows) { Customer obj = new Customer(); obj.setID(((Long) row.get("ID"))); // the object is an Integer obj.setName((String) row.get("NAME")); customers.add(obj); } return customers; } 输出量 Caused by: java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.Long (java.lang.Integer and java.lang.Long are in
  • java.lang.ClassCastException: android.widget.TextView 无法转换(java.lang.ClassCastException: android.widget.TextView cannot be cast)
    问题 12-01 00:36:28.058: E/AndroidRuntime(5062): Caused by: java.lang.ClassCastException: android.widget.TextView cannot be cast to android.widget.EditText 如果有人知道,我会遇到上述错误然后告诉我......我将非常感谢 爪哇: Log.d("Textra", title); Log.d("Dextra", des); EditText t=(EditText) findViewById(R.id.t); EditText d=(EditText) findViewById(R.id.des); t.setText(title); d.setText(des); XML: <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/t" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:textAppearance="
  • 是什么导致 ClassCastException:java.util.TreeSet 无法转换为 java.lang.Comparable?(What causes the ClassCastException: java.util.TreeSet cannot be cast to java.lang.Comparable?)
    问题 所以我试图将一定长度的所有字符串从字符串集合(可以是集合或列表)移动到 TreeMap 并将每个字符串中的字符集设置为该字符串的键,但行map.put(keyRinger(word), word); 抛出java.lang.ClassCastException: java.util.TreeSet cannot be cast to java.lang.Comparable Map<Set<Character>, String> map = new TreeMap<Set<Character>, String>(); for (String words : words) { if (word.length() == length) { map.put(keyRinger(word), word); } } 如果您好奇,这就是keyRing方法。 private Set<Character> keyRinger(String current) { Set<Character> keyRing = new TreeSet<Character>(); for (int i = 0; i < current.length(); i++) { char key = current.charAt(i); keyRing.add(key); } return keyRing; }
  • java.lang.ClassCastException:DTOObject 无法转换为 DTOObject(java.lang.ClassCastException: DTOObject cannot be cast to DTOObject)
    问题 我在运行在 Spring Boot 1.4.0M3 上的应用程序中遇到了一个奇怪的问题,该应用程序使用 Spring 缓存实现,其中提供者是 Redis,我收到 classCastException 无法强制转换相同的对象 我使用 Mongodb 作为数据库,我有用户对象,其中包含延迟加载的角色对象列表,角色内部包含权限对象,如下所示 @Document @Data public class User implements Serializable{ private String passwordResetToken; private boolean enabled = false; @DBRef(lazy= true) private List<Role> roleList; } 我的角色 DTO 如下 @Data @Document public class Role implements Serializable{ private String roleName; private String description; @DBRef(lazy= true) private List<Permission> permissions; } 现在在我的 Spring MVC 中,在加载所有角色时,我正在调用所有权限,因为这是重复操作,我想到了缓存结果并使用 redis
  • 线程“main”中的异常 java.lang.ClassCastException:java.util.ArrayList 无法转换为 org.openqa.selenium.WebElement(Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to org.openqa.selenium.WebElement)
    问题 我正在尝试在电子邮件字段中输入数据“tutorial@gmail.com”,但出现标题/主题中提到的错误。 public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); driver.get("http://www.gmail.com"); ((WebElement)driver.findElements(By.name("Email"))).sendKeys("tutorial@gmail.com"); 回答1 findElements返回java.util.List<WebElement> ,而不是WebElement 。 也许您想使用findElement (没有s ),它返回单个WebElement 。 回答2 使用driver.findElement (它将返回单个元素) 代替 driver.findElements (它将返回列表)
  • java.lang.ClassCastException: libcore.net.http.HttpURLConnectionImpl 无法转换为 javax.net.ssl.HttpsURLConnection(java.lang.ClassCastException: libcore.net.http.HttpURLConnectionImpl cannot be cast to javax.net.ssl.HttpsURLConnection)
    问题 我正在编写一些代码来通过 HTTPS 将文件从设备上传到云。 相关片段: HttpsURLConnection conn = null; URL url = new URL(urlstring); conn = (HttpsURLConnection) url.openConnection(); // exception here. 但演员不会编译: 06-20 15:58:05.311: E/FNF(30286): java.lang.ClassCastException: libcore.net.http.HttpURLConnectionImpl cannot be cast to javax.net.ssl.HttpsURLConnection 我发现了这个类似的问题:使用 java 类 HttpsURLConnection,但我没有从 sun 包中导入任何东西。 我的进口: import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URL; import android.net.Uri