声纳误报,"改变条件,使其不总是评估为真。"

时间:2018-03-08 15:32:42

标签: java sonarqube code-analysis sonarlint

声纳正在提高"改变这种情况,以便它不总是评估为真"以下代码。我咨询了多个人,他们都认为这是误报我们错过了什么?

searchRequest != null

package co.intrasoft.quin_1; import android.support.v4.app.Fragment; import android.support.annotation.NonNull; import android.support.design.widget.BottomNavigationView; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.MenuItem; public class HomeActivity extends AppCompatActivity { BottomNavigationView bottomNavigationView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); bottomNavigationView = findViewById(R.id.navigation); bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { Fragment selectedFragment = null; switch (item.getItemId()){ case R.id.action_category: selectedFragment = CategoryFragment.newInstance(); break; case R.id.action_ranking: selectedFragment = RankingFragment.newInstance(); break; case R.id.action_study: selectedFragment = StudyFragment.newInstance(); break; case R.id.action_profile: selectedFragment = ProfileFragment.newInstance(); break; } FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.frame_layout,selectedFragment); transaction.commit(); return true; } }); setDefaultFragment(); } private void setDefaultFragment() { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.frame_layout,CategoryFragment.newInstance()); transaction.commit(); } } 处的通用catch块中出现错误。 但是如果searchRequest为null,则try块中的第一行将抛出NullPointerException,如果我在catch块中没有检查null,它将在我的catch块中再次中断。让我的方法再次失败,这是我不想要的。

编辑:

正如评论中的一些人要求重现错误的代码我已经将它上传到https://github.com/shariqislam786/test的github,这个问题也可以在eclipse中用声纳lint 3.4重现。

1 个答案:

答案 0 :(得分:1)

SonarJava分析器(5.1.1)的符号执行引擎引发了一个问题,因为它假设到达catch块的唯一方法是至少让searchRequest为非null。这是发动机的限制,目前尚未涵盖这些情况。以下故障单跟踪此限制:SONARJAVA-2669

现在,正如您所说,没有什么可以阻止您使用参数null调用该方法。在这种情况下,NullPointerException将被抛出,实际上,我们将catch (Exception e)阻止,searchRequestnull

SonarJava因此提出误报

现在,关于你的实现选择,我相信处理null这样的情况(通过依赖抛出的异常)并不是人们通常所期望的。输入方法时的明确null - 检查通常更清晰,应该是首选。

请注意,作为一种良好做法,我认为使用searchRequest或某些类似的 nullness 注释来注释方法的@javax.annotation.Nullable参数会更加清晰(这一个)来自JSR-305)。这将有助于其他开发人员(和SonarJava引擎)了解您可以提供参数的状态,并使其清晰明了。